簡體   English   中英

計算分組數據框列中的項目對數。 (熊貓)

[英]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_groupitem列。 在此之后,我使用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.

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