行匹配标准Python Pandas的列索引

时间:2015-02-07 17:17:22

标签: python numpy pandas

我的格式为

的Excel文件中的数据
0,1,0
1,0,0
0,0,1

我想将这些数据转换为一个列表,其中i元素指示i行的非零元素的位置。例如,以上将是:

 [1,0,2]

我试过两种方法无济于事:

方式一(NumPy)

df = pd.read_excel(file,convert_float=False)
idx = np.where(df==1)[1]

这给了我一个奇怪的错误 - idx永远不会与df中的行数相同。对于此数据集,两个数字始终相等。 (我仔细检查过,没有空行。)

第二种方式(熊猫)

  idx = df.where(df==1)

这给我的输出如下:

 52     NaN      NaN      NaN 
 53        1      NaN      NaN 
 54        1      NaN      NaN 

这是合适的形状,但我不知道如何获得列索引

2 个答案:

答案 0 :(得分:3)

设置数据框

import pandas as pd
import numpy as np
df = pd.DataFrame(np.array([[0,1,0],[1,0,0],[0,0,1]]))

使用np.argwhere查找元素索引:

np.argwhere(df.values ==1)

返回:

array([[0, 1],
       [1, 0],
       [2, 2]], dtype=int64)

因此对于第0行,第1列包含1为df:

    0   1   2
 0  0   1   0
 1  1   0   0
 2  0   0   1

注意:

(例如,您可以使用np.array_split(indices, 2,1)[1]获取列索引)

答案 1 :(得分:1)

这是一个适用于包括此用途的有限用例的解决方案。如果您知道行中只有一个1,则可以转置原始数据框,以便原始数据框中列的索引成为转置数据框的行索引。有了它,您可以在每一行中找到最大值并返回这些值的数组。

您的原始数据框不是此解决方案的最佳示例,因为它是对称的,其转置与原始数据框相同。因此,为了解决这个问题,我们将使用一个如下所示的起始数据框:

df = pd.DataFrame({0:[0,0,1], 1:[1,0,0], 2:[0,1,0]})

# original data frame --> df
   0  1  2
0  0  1  0
1  0  0  1
2  1  0  0

# transposed data frame --> df.T
   0  1  2
0  0  0  1
1  1  0  0
2  0  1  0

现在找到每行的最大值:

np.array(df.T.idxmax())

返回一个值数组,表示包含1:

的原始数据框的列索引
[1 2 0]