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