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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:22:54