[英]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.