我有一个消息的数据框(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_index
是pd.concat([...])
的同义词...