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
相关产品推荐
相关产品推荐

