You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Python(优先Pandas)中实现按团队统计食物交集的聚合方法

使用Pandas按团队统计球员共同喜爱的食物数量及占比

问题描述

现有如下DataFrame:

team  | player     | favorite_food
  A   | A_player1  | [pizza, sushi]
  A   | A_player2  | [salad, sushi]
  B   | B_player1  | [pizza, pasta, salad, taco]
  B   | B_player2  | [taco, salad, sushi]
  B   | B_player3  | [taco]

需要按团队统计球员共同喜爱的食物数量及占比,输出结果如下:

team  | #_food_common | percent_food_common
  A   | 1             |  0.33
  B   | 1             |  0.2

如何用Python(优先使用Pandas库)实现?

实现方案

完整代码

import pandas as pd

# 1. 创建原始DataFrame
data = {
    'team': ['A', 'A', 'B', 'B', 'B'],
    'player': ['A_player1', 'A_player2', 'B_player1', 'B_player2', 'B_player3'],
    'favorite_food': [['pizza', 'sushi'], ['salad', 'sushi'], ['pizza', 'pasta', 'salad', 'taco'], ['taco', 'salad', 'sushi'], ['taco']]
}
df = pd.DataFrame(data)

# 2. 定义分组计算逻辑
def calc_team_food_stats(group):
    # 将每个球员的食物列表转为集合
    food_sets = group['favorite_food'].apply(set)
    # 计算所有球员共同喜爱的食物集合
    common_food = set.intersection(*food_sets)
    # 统计团队内所有独特食物的总数
    total_unique_food = set.union(*food_sets)
    # 返回统计结果
    return pd.Series({
        '#_food_common': len(common_food),
        'percent_food_common': round(len(common_food)/len(total_unique_food), 2) if total_unique_food else 0
    })

# 3. 分组执行计算并整理结果
result_df = df.groupby('team').apply(calc_team_food_stats).reset_index()

# 输出目标格式结果
print(result_df.to_string(index=False))

代码说明

  • 集合操作:利用set.intersection获取团队内所有球员共同喜爱的食物,set.union统计团队出现过的全部独特食物,这是统计的核心逻辑。
  • 分组计算:通过groupby('team').apply对每个团队单独执行统计逻辑,确保数据按团队维度聚合。
  • 占比处理:用共同食物数量除以团队总独特食物数量,保留两位小数;同时做了空值保护,避免分母为0的情况。

内容的提问来源于stack exchange,提问作者n_user184

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:27:03