如何拆分DataFrame混合拼接/非拼接元素的Group列并筛选指定组计算平均年龄?
解决方案
问题分析
你的代码存在两个核心问题:
- 逐行判断逻辑错误:
',' in df['Group']是对整个Series做判断,而非逐行检查每行是否包含逗号,导致分支逻辑完全失效。 - 未处理空格与无匹配场景:拆分后的组名带空格(如
' 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
相关产品推荐
相关产品推荐

