2016-11-11 8 views
1

に一致するとき、私は、フォームのパンダのデータフレームを有する、DF =条件パンダにおける列に亘るカウントストリング

index,result1,result2,result3 
    0  s  u  s  
    1  u  s  u 
    2  s      
    3  s  s  u 

私は次のコード

col=['result1','result2','result3'] 
df[cols].count(axis=1) 

このリターンを試みた

index,result1,result2,result3,count 
    0  s  u  s  2 
    1  u  s  u  1 
    2  s      1 
    3  s  s  u  2 

例えばその行S

0,3 
1,3 
2,1 
3,3 

ので、これは私はその後、

df[df[cols]=='s'].count(axis=1) 

を試してみました、要素の数を数えるが、これは次のエラーが返されました:

"[ 'S']ブロック値とを比較することができませんでした"すべてのヘルプは大幅に数値astypeによってstringへのキャストを動作し、NaN列があなたを返す私にとって

+0

欠損値は、ここでは何ですか?彼らは空文字列か 'NaN'ですか? 'df.info()'は何を表示しますか? 'df == 's''はすべてのstrまたは混合dtypeを持っている場合には動作しますが、純粋な数値の列や行がある場合、これは動作しません。すべての' NaN'を持つ行があれば起こります。 count(axis = 1) 'は動作するはずです – EdChum

+0

@WGPおそらく' df ['count'] = 'df.fillna(' '、inplace = True) (df [cols] .values == 's')。sum(1) 'は良い選択肢でしょうか? –

答えて

1

をいただければ幸いです:boolean maskから

print (df) 
    index result1 result2 result3 result4 
0  0  s  u  7  NaN 
1  1  u  s  7  NaN 
2  2  s  NaN  8  NaN 
3  3  s  s  7  NaN 
4  4  NaN  NaN  2  NaN 

print (df.dtypes) 
index  int64 
result1  object 
result2  object 
result3  int64 
result4 float64 
dtype: object 

cols = ['result1','result2','result3','result4'] 
df['count'] = df[df[cols].astype(str) == 's'].count(axis=1) 
print (df) 
    index result1 result2 result3 result4 count 
0  0  s  u  7  NaN  1 
1  1  u  s  7  NaN  1 
2  2  s  NaN  8  NaN  1 
3  3  s  s  7  NaN  2 
4  4  NaN  NaN  2  NaN  0 

それともsumのみTrue値:

print (df[cols].astype(str) == 's') 

    result1 result2 result3 result4 
0 True False False False 
1 False True False False 
2 True False False False 
3 True True False False 
4 False False False False 

cols = ['result1','result2','result3','result4'] 
df['count'] = (df[cols].astype(str) =='s').sum(axis=1) 
print (df) 
    index result1 result2 result3 result4 count 
0  0  s  u  7  NaN  1 
1  1  u  s  7  NaN  1 
2  2  s  NaN  8  NaN  1 
3  3  s  s  7  NaN  2 
4  4  NaN  NaN  2  NaN  0 

別の素敵な解決策がNickil Maveliからである - numpyを使用します。

df['count'] = (df[cols].values=='s').sum(axis=1) 
関連する問題