[英]How to properly update a global variable in python using lambda
我有一个数据框,其中每一行都显示一个交易和该交易中的项目。 这是我的数据框的样子
itemList
A,B,C
B,F
G,A
...
我想找到每个项目的频率(它在交易中出现的次数。我定义了一个字典并尝试更新它的值,如下所示
dict ={}
def update(itemList):
#Update the value of each item in the dict
df.itemList.apply(lambda x: update(x))
由于同时对多行执行apply
函数,因此多行尝试同时更新dict
中的值,这会导致问题。 如何确保多次更新到dict
不会导致任何问题?
我认为你只需要Series.str.get_dummies
:
df['itemList'].str.get_dummies(',').sum().to_dict()
#{'A': 2, 'B': 2, 'C': 1, 'F': 1, 'G': 1}
如果有更多列,请使用:
df.stack().str.get_dummies(',').sum().to_dict()
如果你想为每一行计数:
df['itemList'].str.get_dummies(',').to_dict('index')
#{0: {'A': 1, 'B': 1, 'C': 1, 'F': 0, 'G': 0},
# 1: {'A': 0, 'B': 1, 'C': 0, 'F': 1, 'G': 0},
# 2: {'A': 1, 'B': 0, 'C': 0, 'F': 0, 'G': 1}}
正如@Quang Hoang 在评论中所说, apply
只需使用循环将函数应用于每一行/列
你最好在这里依赖原生 python,
df = pd.DataFrame({'itemlist':['a,b,c', 'b,f', 'g,a', 'd,g,f,d,s,a,v', 'e,w,d,f,g,h', 's,d,f,e,r,t', 'e,d,f,g,r,r','s,d,f']})
这是使用计数器的解决方案,
df['itemlist'].str.replace(',','').apply(lambda x: Counter(x)).sum()
一些比较,
%timeit df['itemlist'].str.split(',', expand = True).stack().value_counts().to_dict()
2.64 ms ± 99.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df['itemlist'].str.get_dummies(',').sum().to_dict()
3.22 ms ± 68.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
from collections import Counter
%timeit df['itemlist'].str.replace(',','').apply(lambda x: Counter(x)).sum()
778 µs ± 12.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.