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

Pandas使用groupby与apply合并列表时出现嵌套列表问题求助

解决groupby+apply合并列表后出现嵌套结构的问题

嘿,我懂你这会儿的困扰——用groupby加apply合并DataFrame里的两列列表,结果搞出嵌套列表的麻烦,确实让人头大。咱们一步步拆解解决!

先明确场景(用示例数据模拟你的情况)

假设你的DataFrame长这样,有分组列,还有两列都是列表格式的年份数据:

import pandas as pd

df = pd.DataFrame({
    'group': ['A', 'A', 'B', 'B'],
    'years1': [[2010, 2011], [2012, 2013], [2015, 2016], [2017, 2018]],
    'years2': [[2014], [2015], [2019], [2020]]
})

你可能踩的坑:直接取列的tolist()导致嵌套

如果你的代码是这样写的,就会得到嵌套列表:

# 错误操作:返回嵌套列表
wrong_result = df.groupby('group').apply(lambda x: [x['years1'].tolist(), x['years2'].tolist()])

比如分组A的结果会是[[[2010,2011],[2012,2013]], [[2014],[2015]]]——这是因为x['years1'].tolist()会把组内每一行的列表当成独立元素,自然就套了一层。

正确解法:先平铺子列表,再合并

根据你想要的最终效果,分两种常见情况:

情况1:把组内所有年份列表完全平铺成单一列表

如果想把分组A的所有年份(不管来自years1还是years2)合并成[2010,2011,2012,2013,2014,2015],可以用列表推导式平铺,或者借助itertools.chain简化代码:

# 方法1:用列表推导式平铺合并
result = df.groupby('group').apply(
    lambda x: [item for sublist in x['years1'] for item in sublist] + 
              [item for sublist in x['years2'] for item in sublist]
)

# 方法2:用itertools.chain更简洁
from itertools import chain
result = df.groupby('group').apply(
    lambda x: list(chain.from_iterable(x['years1'])) + list(chain.from_iterable(x['years2']))
)

情况2:先合并每行的两个列表,再平铺组内结果

如果想先把每行的years1和years2合并(比如第一行变成[2010,2011,2014]),再把组内所有行的合并结果平铺,就这么写:

result = df.groupby('group').apply(
    lambda x: [item for row in x.itertuples() for item in row.years1 + row.years2]
)

可选优化:去重+排序

如果需要合并后去除重复年份并排序,直接在lambda里加上处理:

result = df.groupby('group').apply(
    lambda x: sorted(list(set(chain.from_iterable(x['years1']) | chain.from_iterable(x['years2']))))
)

最终效果

运行正确代码后,你会得到每个分组对应一个单一的年份列表:

group
A    [2010, 2011, 2012, 2013, 2014, 2015]
B    [2015, 2016, 2017, 2018, 2019, 2020]
dtype: object

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:40:13