Python 在匹配字符串时跨行的条件计数
我有一个数据帧的形式,df=Python 在匹配字符串时跨行的条件计数,python,pandas,count,conditional,Python,Pandas,Count,Conditional,我有一个数据帧的形式,df= index,result1,result2,result3 0 s u s 1 u s u 2 s 3 s s u 例如,我想添加另一列,该列包含s在该行中出现的次数列表 index,result1,result2,result3,count 0 s u
index,result1,result2,result3
0 s u s
1 u s u
2 s
3 s s u
例如,我想添加另一列,该列包含s在该行中出现的次数列表
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)
但这又回来了
0,3
1,3
2,1
3,3
所以这会计算元素的数量,我试着
df[df[cols]=='s'].count(axis=1)
但这返回了以下错误:“无法将['s']与块值进行比较”
如果您有任何帮助,我们将不胜感激。对于我来说,通过数字将作品转换为
字符串
,并且NaN
列返回您的错误
:
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
或仅布尔掩码中的真值
值
:
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
另一个不错的解决方案来自-usenumpy
:
df['count'] = (df[cols].values=='s').sum(axis=1)
这里缺少哪些值?它们是空白字符串还是
NaN
?df.info()
显示了什么<如果您有所有str或混合数据类型,则代码>df='s'将起作用,但如果您有任何纯数字列或行,则此操作将不起作用,如果您有任何行具有allNaN
则会发生此情况,您可以尝试df.fillna('',inplace=True)
然后(df[cols]='s')。计数(axis=1)
应work@WGP,也许,df['count']=(df[cols].values=='s').sum(1)
会是一个不错的选择吗?