如果值出现在pandas dataframe的任何列中,如何打印行

时间:2014-07-09 22:53:08

标签: python pandas dataframe

我想打印数据帧的所有行,我在任何列中找到值' - '。有人可以解释一下比下面描述的更好的方法吗?

This Q&A已经解释了如何通过使用布尔索引来完成此操作,但每个列都需要单独声明:

print df.ix[df['A'].isin(['-']) | df['B'].isin(['-']) | df['C'].isin(['-'])]

我尝试了以下操作,但是我收到错误'无法使用多维密钥进行索引':

df.ix[df[df.columns.values].isin(['-'])]

所以我使用了这段代码,但我对每个测试列的单独打印都不满意,因为它更难处理并且可以多次打印同一行:

import pandas as pd

d = {'A': [1,2,3], 'B': [4,'-',6], 'C': [7,8,'-']}
df = pd.DataFrame(d)

for i in range(len(d.keys())):  
    temp = df.ix[df.iloc[:,i].isin(['-'])]
    if temp.shape[0] > 0:
        print temp

输出如下:

   A  B  C
1  2  -  8

[1 rows x 3 columns]

   A  B  C
2  3  6  -

[1 rows x 3 columns]

感谢您的建议。

2 个答案:

答案 0 :(得分:3)

或者,您可以执行df[df.isin(["-"]).any(axis=1)]之类的操作,例如

>>> df = pd.DataFrame({'A': [1,2,3], 'B': ['-','-',6], 'C': [7,8,9]})
>>> df.isin(["-"]).any(axis=1)
0     True
1     True
2    False
dtype: bool
>>> df[df.isin(["-"]).any(axis=1)]
   A  B  C
0  1  -  7
1  2  -  8

(注意我稍微更改了一下框架,所以我不会让轴错误。)

答案 1 :(得分:2)

你可以这样做:

>>> idx = df.apply(lambda ts: any(ts == '-'), axis=1)
>>> df[idx]
   A  B  C
1  2  -  8
2  3  6  -

lambda ts: '-' in ts.values

请注意in查看索引而非值,因此您需要.values