Python:获取数据帧中值的位置

Python:获取数据帧中值的位置,python,search,pandas,Python,Search,Pandas,假设我有以下数据帧: 'a' 'b' 0 0 0 1 1 0 2 0 1 3 0 1 是否有办法获取存在特定值的索引/列值?例如,类似于以下内容的内容: values = df.search(1) 将具有值=[(1,'a'),(2,'b'),(3,'b')] 屈服 [(1, 'a'), (2, 'b'), (3, 'b')] 使用pd.melt+一些其他咀嚼 import pandas as pd df = pd.DataFrame({'a':[0,

假设我有以下数据帧:

   'a' 'b'
0   0   0
1   1   0
2   0   1
3   0   1
是否有办法获取存在特定值的索引/列值?例如,类似于以下内容的内容:

values = df.search(1)
将具有
值=[(1,'a'),(2,'b'),(3,'b')]

屈服

[(1, 'a'), (2, 'b'), (3, 'b')]

使用pd.melt+一些其他咀嚼

import pandas as pd

df = pd.DataFrame({'a':[0,1,0,0],
                    'b':[0,0,1,1]})

df1 = pd.melt(df.reset_index(),id_vars=['index'])
df1 = df1[df1['value'] == 1]
locations = zip(df1['index'],df1['variable'])
输出:

[(1, 'a'), (2, 'b'), (3, 'b')]

如果您不介意使用NumPy数组,第一列表示索引位置,第二列表示列名的索引,因为它位于
df.columns
,那么它很短:

In [11]: np.argwhere(df)
Out[11]: 
array([[1, 0],
       [2, 1],
       [3, 1]])
如果要将其格式化为具有实际列名的元组列表,可以进一步执行以下操作:

In [12]: [(x, df.columns[y]) for x,y in np.argwhere(df)]
Out[12]: [(1, 'a'), (2, 'b'), (3, 'b')]
您可以对
np.argwhere
中的逻辑表达式使用相同的方法,例如,假设您有一些随机数据的数据帧:

In [13]: dfrm
Out[13]: 
          A         B         C
0  0.382531  0.287066  0.345749
1  0.725201  0.450656  0.336720
2  0.146883  0.266518  0.011339
3  0.111154  0.190367  0.275750
4  0.757144  0.283361  0.736129
5  0.039405  0.643290  0.383777
6  0.632230  0.434664  0.094089
7  0.658512  0.368150  0.433340
8  0.062180  0.523572  0.505400
9  0.287539  0.899436  0.194938

[10 rows x 3 columns]
然后您可以这样做,例如:

In [14]: [(x, dfrm.columns[y]) for x,y in np.argwhere(dfrm > 0.8)]
Out[14]: [(9, 'B')]
In [17]: search(dfrm, lambda x: x > 0.8)
Out[17]: [(9, 'B')]

In [18]: search(df, lambda x: x == 1)
Out[18]: [(1, 'a'), (2, 'b'), (3, 'b')]
作为一个搜索函数,可以这样定义:

def search(df, df_condition):
    return [(x, df.columns[y]) for x,y in np.argwhere(df_condition(df))]
例如:

In [14]: [(x, dfrm.columns[y]) for x,y in np.argwhere(dfrm > 0.8)]
Out[14]: [(9, 'B')]
In [17]: search(dfrm, lambda x: x > 0.8)
Out[17]: [(9, 'B')]

In [18]: search(df, lambda x: x == 1)
Out[18]: [(1, 'a'), (2, 'b'), (3, 'b')]

谢谢你的简短回答。你能解释一下你的代码在做什么吗,用
df.stack()
操作吗?
df.stack()
创建一个多索引。因此,您只有双索引的行,而不是行和列。因此,当您调用索引上的
tolist()
方法时,您将得到2个元组。非常简单和优雅的答案。非常感谢。前几周我在玩一些其他的方法。。。这胜过了他们所有人。。。很好地使用
.stack()
。。。书签并添加到我的有用代码段目录+1非常感谢@AlexI一直在寻找如何在pandas数据框中找到值的位置,今天这么久了-我很高兴找到了这个!非常感谢。谢谢你的详细解释。如果我使用的是
numpy
而不是
pandas
@hlin117,这会很好。请注意,在我的示例中,numpy函数直接操作pandas数据帧对象。假装你只使用熊猫或裸体是有点谬误的。如果你用的是熊猫,那么你也用的是NumPy,而现在反过来也是如此。事实上,对于数据帧
df
df.values
返回一个
numpy.ndarray
——突出显示numpy是pandas的依赖项。我劝你不要用“pandas vs.numpy”来看待它,因为使用numpy函数通常比使用pandas函数要好。