我想计算包含特定字符串的每一行中的单元格的数量,具有特定字符串不止一次的单元格应该只计算一次。
我可以计算一行中等于给定值的单元格的数量,但是当我扩展此逻辑以使用str.contains时,我遇到了问题,如下所示
d = {'col1': ["a#", "b","c#"], 'col2': ["a", "b","c#"]}
df = pd.DataFrame(d)
#can correctly count across rows using equality
thisworks =( df =="a#" ).sum(axis=1)
#can count across a column using str.contains
thisworks1=df['col1'].str.contains('#').sum()
#but cannot use str.contains with a dataframe so what is the alternative
thisdoesnt =( df.str.contains('#') ).sum(axis=1)
输出应该是一个序列,显示每行包含给定字符串的单元格的数量。
答案 0 :(得分:2)
import ast
def parse_dummy(x):
parts = x.split('_')
return ast.literal_eval(parts[0]) + (parts[1],)
ret.columns = pd.Series(ret.columns).apply(parse_dummy)
# (i, A, a) (i, A, b) (ii, B, a) (ii, B, b) (ii, B, c)
#0 1 0 0 1 0
#1 0 1 1 0 0
#2 1 0 0 0 1
是一种串联方法。要将其应用于整个数据框,您需要str.contains
或agg
,例如:
apply
如果您既不喜欢df.agg(lambda x: x.str.contains('#')).sum(1)
Out[2358]:
0 1
1 0
2 2
dtype: int64
也不喜欢agg
,则可以使用apply
直接处理np.char.find
的底层numpy数组
df
将其传递给(np.char.find(df.values.tolist(), '#') + 1).astype(bool).sum(1)
Out[2360]: array([1, 0, 2])
的系列或列
df
答案 1 :(得分:1)
类似的事情应该起作用:
df = pd.DataFrame({'col1': ['#', '0'], 'col2': ['#', '#']})
df['totals'] = df['col1'].str.contains('#', regex=False).astype(int) +\
df['col2'].str.contains('#', regex=False).astype(int)
df
# col1 col2 totals
# 0 # # 2
# 1 0 # 1
它应该根据需要归纳为尽可能多的列。
答案 2 :(得分:1)
使用df.apply
的解决方案:
df = pd.DataFrame({'col1': ["a#", "b","c#"],
'col2': ["a", "b","c#"]})
df
col1 col2
0 a# a
1 b b
2 c# c#
df['sum'] = df.apply(lambda x: x.str.contains('#'), axis=1).sum(axis=1)
col1 col2 sum
0 a# a 1
1 b b 0
2 c# c# 2