Pandas中map函数能否返回字典实现多列自动赋值?
pandas实现字典返回函数的列映射自动生成新列
pandas没有内置同名的magic_map方法,但可以通过简单逻辑封装完全实现你要的效果。
首先构造测试基准代码:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({'a': [1, 2, 3, 4]}) # 定义示例映射函数 def red(x): return {'b': x+1, 'c': x+2}
快速实现方式
直接对目标列应用映射函数,将返回的字典序列转换为新的DataFrame后,与原表按行索引拼接即可:
# 小数据量写法 new_columns = df['a'].apply(red).apply(pd.Series) df = pd.concat([df, new_columns], axis=1)
如果处理百万级以上的大数据集,可以用列表构造的方式优化性能,避免apply(pd.Series)的效率损耗:
# 大数据量优化写法 new_columns = pd.DataFrame(df['a'].apply(red).tolist(), index=df.index) df = pd.concat([df, new_columns], axis=1)
运行后得到的结果完全符合预期:
a b c 0 1 2 3 1 2 3 4 2 3 4 5 3 4 5 6
封装为链式调用方法
如果要实现你提到的df.magic_map(red)形式的链式调用,可以通过pandas的自定义访问器实现,一次定义后全局可用:
@pd.api.extensions.register_dataframe_accessor("magic_map") class MagicMap: def __init__(self, pandas_obj): self._df = pandas_obj def __call__(self, map_func, apply_col=None): """ 应用返回字典的映射函数自动生成新列 :param map_func: 逐元素执行、返回字典的映射函数 :param apply_col: 需要执行映射的列名,默认取DataFrame第一列 """ if apply_col is None: apply_col = self._df.columns[0] # 生成新列部分 new_part = pd.DataFrame( self._df[apply_col].map(map_func).tolist(), index=self._df.index ) return pd.concat([self._df, new_part], axis=1)
定义完成后直接调用即可:
df = df.magic_map(red)
- 说明:只要映射函数返回的字典键一致,不管包含多少个键值对,都会自动将键作为新列名,对应值填充到对应行位置,不需要手动提前创建列。
内容的提问来源于stack exchange,提问作者SantoshGupta7
相关产品推荐
相关产品推荐

