如何以向量化方式将Pandas DataFrame多列转为含字典的单列?
高效合并Pandas多列为字典格式单列的方案
针对大型Pandas DataFrame,要把RegAddress.CareOf、RegAddress.POBox这类前缀统一的列合并为每行是字典的RegAddress单列,最快的方式是利用Pandas内置的向量化操作,避免低效的逐行循环:
步骤1:筛选目标列
先提取所有以RegAddress.开头的列,确保只处理需要合并的字段:
target_cols = [col for col in df.columns if col.startswith('RegAddress.')]
步骤2:重命名列并转换为字典列表
通过重命名去掉列名的RegAddress.前缀,再用to_dict('records')直接生成每行对应的字典——这个方法是底层优化过的,性能远高于逐行apply:
# 构造列名映射:把RegAddress.CareOf转为CareOf col_mapping = {col: col.split('.')[1] for col in target_cols} # 转换为字典列表并赋值给新列 df['RegAddress'] = df[target_cols].rename(columns=col_mapping).to_dict('records')
可选:过滤空值键
如果不需要保留字典中空值对应的键,可以结合apply做轻量过滤(注意:此操作比纯to_dict稍慢,但仍远快于手动循环):
df['RegAddress'] = df[target_cols].rename(columns=col_mapping).apply( lambda x: {k: v for k, v in x.items() if pd.notna(v)}, axis=1 )
示例演示
假设你的DataFrame是这样的:
import pandas as pd data = { 'RegAddress.CareOf': ['Alice', None, 'Bob'], 'RegAddress.POBox': [123, 456, None], 'OtherColumn': ['X', 'Y', 'Z'] } df = pd.DataFrame(data)
执行上述代码后,df['RegAddress']的结果为:
- 第一行:
{'CareOf': 'Alice', 'POBox': 123} - 第二行:
{'CareOf': None, 'POBox': 456}(如果用空值过滤则为{'POBox': 456}) - 第三行:
{'CareOf': 'Bob', 'POBox': None}(过滤后为{'CareOf': 'Bob'})
性能说明
to_dict('records')是Pandas针对行转字典场景优化的向量化方法,处理百万级数据的速度比自定义循环快几十倍。如果你的DataFrame规模极大,也可以考虑用pyarrow等库做进一步加速,但常规场景下内置方法足够满足需求。
内容的提问来源于stack exchange,提问作者Dom White
相关产品推荐
相关产品推荐

