[英]Counting the number of pairs of items in a grouped dataframe's column. (Pandas)
我想計算一列中項目對的數量。 我為此制定了解決方案,但我想知道是否有更簡潔的解決方案。
這是一個例子和我的方法。 我有一個像這樣的 DataFrame。
df = pd.DataFrame({'id':[1,1,2,2], 'item':['apple','orange','orange','apple']})
最后,想知道大家一起買的最多的東西是什么。 因此,在這種情況下,我想得到橙子和蘋果一起購買最多的結果。
然后,我根據id
列中的值進行了 groupby。
id_group = df.groupby('id')
然后,為了計算item
列中項目對的數量,我制作了一個如下所示的 function 並應用於id_group
的item
列。 在此之后,我使用sum()
組合了元組列表。 最后,我使用Counter()
來計算包含相同項目的對數。 在combos()
中,我使用sorted()
來避免分別計算('apple','orange')
和('orange','apple')
。
是否有更好的方法來獲得顯示有 2 對('apple','orange')
或 2 對('orange','apple')
結果
import itertools
from collections import Counter
def combos(x):
combinations = []
num = x.size
while num != 1:
combinations += list(itertools.combinations(x,num))
num -= 1
element_sorted = map(sorted,combinations)
return list(map(tuple,element_sorted))
k= id_group['item'].apply(lambda x:combos(x)).sum()
Counter(k)
使用all_subsets
function 將0
更改為2
用於對、三重......就像你的解決方案:
#https://stackoverflow.com/a/5898031
from itertools import chain, combinations
def all_subsets(ss):
return chain(*map(lambda x: combinations(ss, x), range(2, len(ss)+1)))
然后展平值,我認為最好不要使用sum
來連接列表。 它看起來很花哨,但它是二次的,應該被認為是不好的做法。
所以這里在列表理解中使用排序元組進行展平:
k = [tuple(sorted(z)) for y in id_group['item'].apply(all_subsets) for z in y]
print (Counter(k))
Counter({('apple', 'orange'): 2})
這個怎么樣?
from collections import Counter
k = df.groupby('id')['item'].apply(lambda x: tuple(x.sort_values()))
Counter(k)
Counter({('apple', 'orange'): 2})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.