2017-07-26 14 views
1

私は30列のデータフレームを持っており、これらの列のうち10個の値にフィルタをかけて一致するすべての行を返したいとします。以下の例では、私はこれらの仕事の両方がそれらの列を見つけるために特定の値を持つ特定の列を選択するpandas

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] 

「いい...」で終わるすべてのDF列内の1に等しい値を検索したいが一致しないすべてはと表示されますNaN。私の質問は、どのように特定の値の特定の列をクエリすることができますすべて一致しない行がNaNとして表示されませんか?

+0

.isin([1])の代わりに.any(1)を使用します。 – sera

答えて

1

最初に列をフィルタリングしてstr.endswithとし、列を[]で選択し、eqと比較することができます。最後の行ごとに少なくとも1つの1ためanyを追加

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 

EDIT:

の場合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 
関連する問題