Pandas根据项值返回索引和列名

时间:2014-08-19 06:05:26

标签: python pandas data-analysis

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

enter image description here

所以,让我今天尝试返回值为>的所有值的索引和列名称。 0.75。

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

我希望这可以归还“交通和抢劫”。 但是,这会返回所有值。我没有在文档,在线或这里找到答案。 提前谢谢。

3 个答案:

答案 0 :(得分:5)

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

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删除重复项,一种方法*是0那些不在上对角线上的triu(不幸的是,这不会作为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 :(得分: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

答案 2 :(得分: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

并做

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()除去双键对,但假设每个键对都有一个唯一值(这是有争议的)。