如何用向量化方式将给定Pandas DataFrame重构为目标结构?
高效重构DataFrame:替代循环的向量化/Apply方案
问题背景
手里有个原始DataFrame,要转成指定结构的目标DataFrame(已经搭好索引和列的空架子),现在用循环能实现,但想换成apply或者更高效的向量化方法来提速。
解决方案示例(基于常见场景模拟)
先假设你的数据结构是这类典型情况,你可以根据实际结构调整:
import pandas as pd # 模拟原始DataFrame df_raw = pd.DataFrame({ '分组': ['组A', '组A', '组B', '组B'], '指标类型': ['营收', '成本', '营收', '成本'], '数值': [500, 300, 700, 450] }) # 已经创建好的空目标DataFrame target_idx = ['统计值'] target_cols = ['组A营收', '组A成本', '组B营收', '组B成本'] df_target = pd.DataFrame(index=target_idx, columns=target_cols)
方法1:纯向量化(最快首选)—— 用Pivot转宽后匹配填充
先把原始数据转成宽格式,直接对应目标列填充:
# 原始数据转宽表,生成和目标列一致的列名 df_wide = df_raw.pivot(columns=['分组', '指标类型'], values='数值') df_wide.columns = [f'{col[0]}{col[1]}' for col in df_wide.columns] # 一键填充目标表 df_target.loc[:, df_wide.columns] = df_wide.values
方法2:Apply方法(适合复杂映射规则)
如果原始和目标的列名映射逻辑比较特殊,先定义映射字典,再用apply批量赋值:
# 定义原始(分组, 指标)到目标列的映射 col_map = { ('组A', '营收'): '组A营收', ('组A', '成本'): '组A成本', ('组B', '营收'): '组B营收', ('组B', '成本'): '组B成本' } # 用apply遍历原始行填充目标表 df_raw.apply(lambda row: df_target.at['统计值', col_map[(row['分组'], row['指标类型'])]] == row['数值'], axis=1)
方法3:Merge+重塑(通用型向量化)
如果目标结构维度更多,先拆分目标列的信息,合并后填充:
# 拆分目标列的分组和指标信息 target_meta = pd.DataFrame({'目标列': target_cols}) target_meta[['分组', '指标类型']] = target_meta['目标列'].str.extract(r'(组\w+)(\w+)') # 合并原始数据和目标元信息 merged = pd.merge(df_raw, target_meta, on=['分组', '指标类型']) # 填充目标表 df_target.loc['统计值', merged['目标列']] = merged['数值'].values
为什么不用循环?
- 向量化操作(pivot/merge)是C级别的底层实现,数据量大时比Python循环快几十到上百倍
- Apply虽然本质是循环,但代码更简洁易维护,适合规则复杂的场景
内容的提问来源于stack exchange,提问作者Gilhmm
相关产品推荐
相关产品推荐

