我有一个消息的数据框(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方法来解决呢?

最佳答案

基于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([...])的同义词...

09-06 02:04
查看更多