如何统计同一订单中水果组合的出现频次
如何统计同一订单中水果组合的出现频次
嗨,这个需求其实用 pandas 配合 itertools 就能轻松搞定,我给你一步步拆解下怎么做:
步骤1:准备环境和示例数据
首先我们先导入需要的库,再把你给出的示例数据构造出来:
from itertools import combinations import pandas as pd # 构造示例数据,和你提供的一致 df = pd.DataFrame({ 'order': [1,1,1,2,2,2,2,3,3,3], 'fruit': ['apple','grape','peach','orange','apple','raspberry','peach','apple','peach','orange'], 'qty': [5,8,3,6,4,3,2,8,6,3] })
步骤2:生成每个订单内的水果两两组合
这一步是核心:我们按订单分组,对每个订单里的水果列生成不重复的两两组合(用combinations而不是permutations,这样apple/peach和peach/apple会被视为同一个组合,不会重复统计)。同时给每个组合里的水果按字母排序,确保组合的一致性:
# 按order分组,生成每个订单内的有序两两水果组合 combinations_per_order = df.groupby('order')['fruit'].apply(lambda x: list(combinations(sorted(x), 2)))
步骤3:展开组合并统计频次
接下来把每个订单的组合列表拆成单独的行,再把组合转换成字符串格式,最后统计每个组合的出现次数:
# 把嵌套的组合列表展开成单独行 all_combinations = combinations_per_order.explode() # 将元组形式的组合转换成"水果1/水果2"的字符串格式 all_combinations_str = all_combinations.apply(lambda x: '/'.join(x)) # 统计每个组合的频次,并整理成目标格式 result = all_combinations_str.value_counts().reset_index() result.columns = ['f', 't']
最终结果
运行完上面的代码后,打印result就能得到你想要的输出:
f t 0 apple/peach 3 1 apple/orange 2 2 apple/raspberry 1 3 orange/peach 1 4 apple/grape 1 5 grape/peach 1 6 orange/raspberry 1 7 peach/raspberry 1
这个方法简单高效,对于常规规模的数据集完全够用,而且逻辑清晰,容易理解和调整~
备注:内容来源于stack exchange,提问作者teogj
相关产品推荐
相关产品推荐

