Pandas分组后合并嵌套字符串列表并计算整数列均值
解决思路
你遇到的问题核心是统一使用tolist聚合导致不同列的格式不符合预期——Name列变成了嵌套列表,Price列被转为重复值的列表,后续无法直接对Price做数值计算。我们可以分两种场景处理:一种是从原始数据直接分组聚合(推荐,更高效),另一种是对已经聚合后的结果做格式修正。
场景1:从原始DataFrame直接分组聚合(推荐)
首先先构造你的原始数据(模拟):
import pandas as pd # 原始数据 df = pd.DataFrame({ 'Id': [1, 1], 'Name': ['[ABC]', '[XYZ]'], # 假设原始是带括号的字符串,或者直接是列表 'Price': [33900, 33900] })
步骤1:清理Name列(如果是带括号的字符串)
如果你的Name列是带[]的字符串,先去掉括号提取内容:
df['Name'] = df['Name'].str.strip('[]')
步骤2:针对不同列指定聚合逻辑
不要统一用tolist,而是给Name和Price分别设置聚合函数:
Name列:用list直接聚合为一维列表Price列:如果值都相同,用first取第一个值;如果有不同值,用np.mean计算均值(直接在聚合阶段处理,避免生成列表)
# 聚合操作 result = df.groupby('Id').agg( Name=('Name', list), Price=('Price', 'first') # 替换成'np.mean'可以计算均值 ) print(result)
输出结果就是你想要的格式:
Name Price Id 1 [ABC, XYZ] 33900
场景2:对已经聚合后的结果做格式修正
如果你已经得到了嵌套列表的分组结果(比如已经执行过groupby('Id').agg(tolist)),可以对现有列做扁平化/取值处理:
假设你的聚合后数据是:
grouped_df = pd.DataFrame({ 'Id': [1], 'Name': [[['ABC'], ['XYZ']]], # 嵌套列表 'Price': [[33900, 33900]] # 数值列表 })
处理Name列:扁平化嵌套列表
用列表推导式把嵌套的列表展开成一维:
grouped_df['Name'] = grouped_df['Name'].apply(lambda x: [item for sublist in x for item in sublist])
处理Price列:提取唯一值或计算均值
如果Price列表里的值都相同,直接取第一个元素;如果有不同值,计算均值:
# 取第一个值 grouped_df['Price'] = grouped_df['Price'].apply(lambda x: x[0]) # 或者计算均值(如果有不同值的情况) # grouped_df['Price'] = grouped_df['Price'].apply(lambda x: np.mean(x))
执行后就能得到目标格式的结果。
关键提醒
- 避免对所有列统一使用
tolist聚合,不同列的类型和需求不同,要针对性设置聚合函数 - 如果原始数据中
Name本身就是列表类型(比如[ABC]是列表而不是字符串),聚合时用list会生成嵌套列表,这时候可以用lambda x: sum(x, [])来扁平化(不过推荐在聚合前先处理成字符串再聚合,更清晰)
内容的提问来源于stack exchange,提问作者Himanshu Sharma
相关产品推荐
相关产品推荐

