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

如何拆分DataFrame混合拼接/非拼接元素的Group列并筛选指定组计算平均年龄?

解决方案

问题分析

你的代码存在两个核心问题:

  1. 逐行判断逻辑错误:',' in df['Group']是对整个Series做判断,而非逐行检查每行是否包含逗号,导致分支逻辑完全失效。
  2. 未处理空格与无匹配场景:拆分后的组名带空格(如' D'),无法与group_list中的'D'匹配;若某行无匹配组,list(...)会返回空列表,取[0]会触发索引越界错误,这也是内核崩溃的原因。

正确实现代码

import pandas as pd

# 构建示例DataFrame
data = {
    'Name': ['Mary', 'Lukas', 'John', 'Mary', 'Lukas', 'John', 'Mary', 'Lukas', 'John'],
    'Group': ['A, D, T, F', 'A, D, T, F', 'A, D, T, F', 'B, G, Y, Z', 'B, G, Y, Z', 'B, G, Y, Z', 'K', 'L', 'M'],
    '平均年龄': [10, 20, 5, 15, 25, 50, 12, 23, 56]
}
df = pd.DataFrame(data)

group_list = ['D', 'Y', 'K', 'L', 'M']
group_set = set(group_list)  # 转集合提升匹配效率

# 提取每行匹配的组:处理空格,无匹配时返回None
df['匹配组'] = df['Group'].str.split(',').apply(
    lambda x: next((g.strip() for g in x if g.strip() in group_set), None)
)

# 过滤出有匹配组的行
filtered_df = df.dropna(subset=['匹配组'])

# 获取每个姓名在对应匹配组的平均年龄(原数据每个组合唯一,直接保留即可)
print(filtered_df[['Name', '匹配组', '平均年龄']])

# 按姓名分组,计算该姓名在所有匹配组中的总平均年龄
name_avg = filtered_df.groupby('Name')['平均年龄'].mean().reset_index()
print("\n按姓名汇总平均年龄:")
print(name_avg)

# 按匹配组分组,计算每组内的平均年龄
group_avg = filtered_df.groupby('匹配组')['平均年龄'].mean().reset_index()
print("\n按组汇总平均年龄:")
print(group_avg)

代码说明

  • group_set = set(group_list):将列表转为集合,大幅提升成员判断的效率。
  • next(..., None):遍历拆分后的组名(先去除空格),找到第一个匹配的组;若无匹配则返回None,避免索引越界错误。
  • dropna(subset=['匹配组']):过滤掉无匹配组的行,确保后续计算的有效性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:47:05