我想打印数据帧的所有行,我在任何列中找到值' - '。有人可以解释一下比下面描述的更好的方法吗?
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]
感谢您的建议。
答案 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