如何为Pandas Series应用返回多行的函数并添加二级索引
Pandas Series逐元素应用多值函数并生成二级MultiIndex索引
问题场景
现有单级索引的Pandas Series,需要对每个元素应用一个返回多值的函数(返回值可为Series或列表),最终生成带二级MultiIndex的新Series:原索引作为第一级,每个返回值的位置作为第二级。
解决方案
方案1:兼容返回Series的函数(groupby + apply)
如果你的函数返回pd.Series,可以通过groupby(level=0).apply实现,之后为二级索引添加名称:
import pandas as pd # 示例原Series s = pd.Series([2, 3], index=['a', 'b']) # 定义返回Series的函数 def my_func(x): return pd.Series([10, 20, 30]) if x == 2 else pd.Series([40, 50]) # 生成带二级索引的结果 result = s.groupby(level=0).apply(lambda x: my_func(x.iloc[0])) # 为索引层级命名 result.index = result.index.set_names(["原索引", "值序号"])
方案2:返回列表+DataFrame.stack()(更高效)
将函数改为返回列表,通过pd.DataFrame转换后调用stack(),这是性能更优的方案:
# 修改函数返回列表 def my_func(x): return [10, 20, 30] if x == 2 else [40, 50] # 转换流程 temp_df = pd.DataFrame(s.apply(my_func).tolist(), index=s.index) result = temp_df.stack() # 为索引层级命名 result.index = result.index.set_names(["原索引", "值序号"])
关键提示
- 方案2的执行效率更高,因为
tolist()和stack()都是Pandas内部优化的矢量化操作,适合处理大数据量 - 两种方案最终都能得到符合需求的二级MultiIndex Series,可根据函数返回类型选择对应方式
内容的提问来源于stack exchange,提问作者Confounded
相关产品推荐
相关产品推荐

