在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
相关产品推荐
相关产品推荐

