2016-11-11 8 views
1

passend habe ich pandas Datenrahmen von der Form, df =Conditional Zählung über eine Zeile in pandas wenn eine Zeichenfolge

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

i möchte eine andere Spalte hinzuzufügen, die eine Liste von der Anzahl von Malen enthält s tritt in diese Reihe, beispielsweise

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

i den folgenden Code

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

aber diese Rückkehr versucht haben, s

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

so zählt dies die Anzahl der Elemente, ich habe dann versucht

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

aber das gab die folgenden Fehler: "Kann nicht vergleichen [ 's'] mit Blockwerten"

jede Hilfe wäre sehr

+0

Was sind die fehlenden Werte hier? Sind sie leere Saiten oder 'NaN'? Was zeigt 'df.info()'? 'df == 's'' funktioniert, wenn Sie alle str oder gemischte dtypes haben, aber wenn Sie irgendwelche reinen numerischen Spalten oder Zeilen haben, dann wird dies nicht funktionieren, dies wird passieren, wenn Sie irgendwelche Zeilen mit allen' NaN' haben versuche 'df.fillna ('', inplace = True)' then '(df [cols] = 's'). count (axis = 1)' sollte funktionieren – EdChum

+0

@WGP, Vielleicht, 'df ['count'] = (df ​​[cols] .values ​​== 's'). sum (1) 'wäre eine gute Alternative? –

Antwort

1

Für mich erkannt werden, arbeitet cast string durch astype numerische und NaN Spalten zurückgeben Ihre error:

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 

Oder sum nur True Werte von boolean mask:

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 

Eine weitere schöne Lösung von Nickil Maveli ist - verwenden numpy:

df['count'] = (df[cols].values=='s').sum(axis=1) 
Verwandte Themen