簡體   English   中英

如何使用 lambda 在 python 中正確更新全局變量

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM