DataFrame中特定项的值计数

时间:2018-05-30 04:25:41

标签: python pandas dataframe count

我的消息数据框(df)与以下内容类似:

From                To
person1@gmail.com   stranger1@gmail.com
person2@gmail.com   stranger1@gmail.com, stranger2@gmail.com
person3@gmail.com   person1@gmail.com, stranger2@gmail.com

我想计算每封电子邮件从特定列表中显示的次数。我的名单是:

lst = ['person1@gmail.com', 'stranger2@gmail.com', 'person3@gmail.com']

我希望收到一个数据框/系列/字典,结果如下:

list_item              Total_Count
person1@gmail.com      2
stranger2@gmail.com    2
person3@gmail.com      1

我尝试过几种不同的东西,但没有成功。我以为我可以尝试类似下面的for循环(它返回一个语法错误),但我找不到正确的方法来编写它。

for To,From in zip(df.To, df.From): 
    for item in lst:
        if To,From contains item in emails:
            Count(item)

这种类型的任务是应该用for循环完成还是开箱即用的pandas方法可以解决这个问题?

1 个答案:

答案 0 :(得分:2)

stack - 基于

拆分To列,stack所有内容,然后执行value_counts

v = pd.concat([df.From, df.To.str.split(', ', expand=True)], axis=1).stack()
v[v.isin(lst)].value_counts()

stranger2@gmail.com    2
person1@gmail.com      2
person3@gmail.com      1
dtype: int64

melt

另一种选择是使用melt

v = (df.set_index('From')
      .To.str.split(', ', expand=True)
      .reset_index()
      .melt()['value']
)
v[v.isin(lst)].value_counts()

stranger2@gmail.com    2
person1@gmail.com      2
person3@gmail.com      1
Name: value, dtype: int64

请注意,set_index + str.split + reset_indexpd.concat([...])同义......