2017-07-26 199 views
1

所以我有一个30列的数据框,我想过滤它的10列中找到的值,并返回所有匹配的行。在下面的例子中,我想对相等的值在所有以结束DF栏搜索到1“好......”选择特定值的特定列大熊猫

df[df[[i for i in df.columns if i.endswith('good')]].isin([1])] 

df[df[[i for i in df.columns if i.endswith('good')]] == 1] 

这两项工作,发现不匹配出现的那些列,但一切NaN的。我的问题是如何查询特定值的特定列,并有所有不匹配的行不显示为NaN?

+0

使用.any(1)而不是.isin([1]) – sera

回答

1

你可以先用str.endswith[]过滤列,选择列和eq比较。最后添加any至少一个1每行

cols = df.columns[df.columns.str.endswith('good')] 
df1 = df[df[cols].eq(1).any(axis=1)] 

样品:

df = pd.DataFrame({'A':list('abcdef'), 
        'B':[1,1,4,5,5,1], 
        'C good':[7,8,9,4,2,3], 
        'D good':[1,3,5,7,1,0], 
        'E good':[5,3,6,9,2,1], 
        'F':list('aaabbb')}) 

print (df) 
    A B C good D good E good F 
0 a 1  7  1  5 a 
1 b 1  8  3  3 a 
2 c 4  9  5  6 a 
3 d 5  4  7  9 b 
4 e 5  2  1  2 b 
5 f 1  3  0  1 b 

cols = df.columns[df.columns.str.endswith('good')] 

print (df[cols].eq(1)) 
    C good D good E good 
0 False True False 
1 False False False 
2 False False False 
3 False False False 
4 False True False 
5 False False True 

df1 = df[df[cols].eq(1).any(1)] 
print (df1) 
    A B C good D good E good F 
0 a 1  7  1  5 a 
4 e 5  2  1  2 b 
5 f 1  3  0  1 b 

您的解决方案是非常接近,只添加any

df1 = df[df[[i for i in df.columns if i.endswith('good')]].isin([1]).any(axis=1)] 
print (df1) 
    A B C good D good E good F 
0 a 1  7  1  5 a 
4 e 5  2  1  2 b 
5 f 1  3  0  1 b 

编辑:

如果只需要1并删除所有其他行和列:

df1 = df.loc[:, df.columns.str.endswith('good')] 
df2 = df1.loc[df1.eq(1).any(1), df1.eq(1).any(0)] 
print (df2) 
    D good E good 
0  1  5 
4  1  2 
5  0  1