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

如何展开groupby后lambda函数生成的列表

解决分组后展开列表为多行并保留原索引的问题

嘿,这个问题我熟!你现在遇到的是分组处理后,如何把每个组返回的列表展开成独立行,同时保留原分组索引的问题。之前用.apply(pd.Series)会把列表转成一行多列,这显然不是你想要的效果,下面给你两种简洁的解决方案:

方法一:用explode展开列表(最直观)

explode是Pandas专门用来把包含列表的Series元素拆分成多行的方法,完美匹配你的需求。步骤如下:

完整代码示例

import pandas as pd
import numpy as np

# 定义你的处理函数
def fun(x): 
    return np.r_[np.repeat(x[:1],2),x,np.repeat(x[:-1],2)]

# 构造示例DataFrame(和你给出的结构一致)
data = {
    'col': [0.952613, 0.929144, 0.903109, 0.876384, 0.850252, 1.185296, 1.155291, 1.119522]
}
df = pd.DataFrame(data, index=[33]*8)

# 1. 分组处理得到每个组对应的列表
grouped_result = df.groupby(df.index).apply(lambda x: fun(x.col))

# 2. 用explode展开列表为多行,同时保留原索引
final_df = grouped_result.explode().reset_index(name='col')

# 查看结果
print(final_df.head(10))

效果说明

执行后,每个列表里的元素都会变成单独一行,原分组索引(比如33)会对应每一个展开后的元素,和你想要的原DataFrame结构完全一致。

方法二:分组时直接返回Series(一步到位)

如果你想跳过生成中间列表的步骤,可以在groupby.apply里直接返回一个Series,Pandas会自动把每个组的Series按行拼接起来:

final_df = df.groupby(df.index).apply(
    lambda x: pd.Series(fun(x.col), name='col')
).reset_index(level=1, drop=True).reset_index()

代码解释

  • pd.Series(fun(x.col), name='col'):把每个组的处理结果直接转成Series,指定列名
  • reset_index(level=1, drop=True):去掉分组后自动生成的二级索引
  • reset_index():把原分组索引转成普通列,最终得到和原结构一致的DataFrame

为什么之前的apply(pd.Series)不行?

当你对每个组的列表用apply(pd.Series)时,Pandas会把列表的每个元素当成列来处理,所以会生成一行多列的结果;而我们需要的是把列表元素当成行,explode或者直接返回Series才是正确的方向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:03:04