我的消息数据框(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方法可以解决这个问题?
答案 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_index
与pd.concat([...])
同义......