基于项目值,Pandas 返回索引和列名

4
我正在尝试根据项目值返回列名和索引。我的代码如下:
所以,假设我要返回所有值大于0.75的索引和列名。
for date, row in df.iterrows():
    for item in row:
        if item > .75:
            print index, row

我希望这个返回“交通和抢劫”。然而,它返回所有的值。我在文档、在线或这里都没有找到答案。谢谢您的帮助。

为了以后的参考,请直接将 df.head() 粘贴到问题中,而不是使用截图。这样我们就可以通过复制和粘贴数据框来在控制台中操作。 - FooBar
3个回答

5
使用稍微不同的数字(没有特定原因),您可以将其堆叠为Series,然后使用布尔索引:
In [11]: df.stack()
Out[11]:
assault  assault    1.00
         robbery    0.76
         traffic    0.60
robbery  assault    0.76
         robbery    1.00
         traffic    0.78
traffic  assault    0.68
         robbery    0.78
         traffic    1.00
dtype: float64

In [12]: s = df.stack()

In [13]: s[(s!=1) & (s>0.77)]
Out[13]:
robbery  traffic    0.78
traffic  robbery    0.78
dtype: float64

您可以使用一些numpy方法来删除重复项,其中一种方法是使用triu函数将非上三角部分的元素标记为0(不幸的是,这不会返回DataFrame :( ):
In [21]: np.triu(df, 1)
Out[21]:
array([[ 0.  ,  0.76,  0.6 ],
       [ 0.  ,  0.  ,  0.78],
       [ 0.  ,  0.  ,  0.  ]])

In [22]: s = pd.DataFrame(np.triu(df, 1), df.index, df.columns).stack() > 0.77

In [23]: s[s]
Out[23]:
robbery  traffic    True
dtype: bool

In [24]: s[s].index.tolist()
Out[24]: [('robbery', 'traffic')]

我怀疑有更高效的方法...


1
如果您想保留for循环,可以使用列和索引:
for i in df.index:
  for j in df.columns:
    if (i != j) and (df[i][j] > 0.75):
      print(i,j)

输出将是:

然后输出:

robbery traffic
traffic robbery

更新: 正如FooBar指出的那样,这种方法效率低下。最好使用像FooBar和Andy Hayden建议的那样的方法:

In [3]: df[(df>0.75) & (df!=1)].stack().drop_duplicates()
Out[3]: robbery  traffic    0.78
        dtype: float64

保留for循环是一种非常低效(且丑陋)的方法来实现这个。 - FooBar

1
我开始使用


         assault  robbery  traffic
index                             
assault     1.00     0.74     0.68
robbery     0.74     1.00     0.78
traffic     0.68     0.78     1.00

and do

df = df.reset_index()
df2 = df.stack().reset_index()
df2.drop_duplicates(0)[df2[0] > 0.75][['index', 'level_1']]

     index  level_1
0  assault  assault
5  robbery  traffic
< p > 在去除重复键值对时,drop_duplicates() 假定每个键值对都有唯一的值(这是有争议的)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接