【问题标题】:Pandas return index and column name based on the item valuePandas 根据项目值返回索引和列名
【发布时间】:2014-10-12 03:42:44
【问题描述】:

我正在尝试根据项目值返回列名和索引。 我有这样的事情:

所以让我尝试返回值 > 0.75 的所有值的索引和列名。

for date, row in df.iterrows():
    for item in row:
        if item > .75:
            print index, row

我希望它返回“交通和抢劫”。 但是,这将返回所有值。我没有在文档、在线或此处找到答案。 提前谢谢你。

【问题讨论】:

  • 为了将来参考,只需将df.head() 粘贴到问题中,而不是使用屏幕截图。我们可以通过这种方式将数据框复制并粘贴到我们的控制台中......

标签: python pandas data-analysis


【解决方案1】:

使用稍微不同的数字(无特殊原因),您可以堆叠到一个系列,然后使用布尔索引:

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')]

*我怀疑还有更有效的方法...

【讨论】:

    【解决方案2】:

    我从

    开始
             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
    

    然后做

    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
    

    drop_duplicates() 去掉了双密钥对,但假设每个密钥对都有一个唯一值(这是有争议的)。

    【讨论】:

      【解决方案3】:

      如果你想保留 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 循环是一种非常低效(而且丑陋)的方法。
      猜你喜欢
      • 1970-01-01
      • 2019-12-04
      • 2015-05-15
      • 2016-10-06
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      相关资源
      最近更新 更多