根据str.contains(或类似内容)对数据框列进行计数

时间:2019-05-28 23:50:48

标签: python pandas numpy

我想计算包含特定字符串的每一行中的单元格的数量,具有特定字符串不止一次的单元格应该只计算一次。

我可以计算一行中等于给定值的单元格的数量,但是当我扩展此逻辑以使用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)

输出应该是一个序列,显示每行包含给定字符串的单元格的数量。

3 个答案:

答案 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.containsagg,例如:

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