TransWikia.com

pandasの2次元配列から、1の値が入っている行、列番号を列挙する方法

スタック・オーバーフロー Asked by ktakita on November 20, 2021

2値の値が入っているnumpy arrayがあります。
そのarrayから1の値が入っている行と列番号を列挙したいです。

イメージ

以下のようなdataframeデータがあるとします

df = pd.DataFrame(np.array([[0,0,1],[1,0,1],[4,0,1]]))
df.index = [0, 1, 4]

これは以下のような表になると思います。
画像の説明をここに入力
これを以下のように1の場所のみを抽出してarryaにするプログラムを作成したいです。
実際は100*800の2次元配列なので、プログラムで自動化したいです。

出力したい内容

2 Answers

numpy.where()を使うと以下の様になります。

import numpy as np
import pandas as pd

df = pd.DataFrame(
  np.array([
    [0, 0, 1],
    [1, 0, 1],
    [4, 0, 1]
  ]), index=[0, 1, 4]
)

dfn = pd.DataFrame(
  [(df.columns[p[1]], df.index[p[0]]) for p in zip(*np.where(df == 1))],
  columns=('x', 'y')
)
dfn.index += 1

print(dfn)

   x  y
1  2  0
2  0  1
3  2  1
4  2  4

Answered by user39889 on November 20, 2021

2重ループで該当の座標を抽出する方法です。

※質問コメントの通り、ご質問の抽出結果は(index, x, y)=(4, 2, 4)の誤植と想定した回答です。

サンプルコード
import pandas as pd
import numpy as np

df = pd.DataFrame(np.array([[0,0,1],[1,0,1],[4,0,1]]))
df.index = [0, 1, 4]

list = []
for c in df.columns:
    for i in df.index:
        if df.loc[i, c] == 1:
            list.append([c, i])

locs = pd.DataFrame(np.array(list))
locs.columns = ['x', 'y']
print(locs)
出力結果
   x  y
0  0  1
1  2  0
2  2  1
3  2  4
本家SOの関連質問

Answered by payaneco on November 20, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP