2016-11-11 2 views
1

У меня панды dataframe вида, DF =Условного подсчет по строке в панде при совпадении строки

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

я хотел бы добавить еще один столбец, который содержит список того, сколько раз ей происходит в что строка, например

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

Я попытался следующий код

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

, но это возвращение s

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

так это подсчитывает количество элементов, я затем попытался

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

но возвратил следующую ошибку: "Не удалось сравнить [ 's'] со значениями блока"

Любая помощь была бы принята с благодарностью

+0

Какие недостающие значения здесь? Это пустые строки или «NaN»? что делает 'df.info()' show? 'df == 's'' будет работать, если у вас есть все str или смешанные типы dtypes, но если у вас есть чистые числовые столбцы или строки, это не сработает, это произойдет, если у вас есть любые строки со всеми« NaN ». попробуйте 'df.fillna ('', inplace = True)' then '(df [cols] = 's'). count (axis = 1)' должен работать – EdChum

+0

@WGP, Возможно, 'df ['count'] = (df ​​[cols] .values ​​== 's'). sum (1) 'будет хорошей альтернативой? –

ответ

1

Для меня работы отлиты string от astype числовые и NaN столбцы возвращают 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 

Или sum только True значения из 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 

Еще одно интересное решение от Nickil Maveli - использовать numpy:

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

 Смежные вопросы

  • Нет связанных вопросов^_^