2017-07-26 205 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