繁体   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