基于两个现有Pandas DataFrame创建新DataFrame的高效实现咨询
问题解答
嵌套字典方案的合理性
你的嵌套字典方案是合理的,尤其针对你这种大尺寸的DataFrame(599379行×319列),因为字典的键值对查找是O(1)时间复杂度,能高效完成列值映射操作,避免多次合并带来的性能损耗。
如何从df2创建嵌套字典
可以利用pandas的groupby和apply方法快速生成目标嵌套字典:
# 从df2生成嵌套映射字典 mapping_dict = df2.groupby('C').apply(lambda group: dict(zip(group['D'], group['E']))).to_dict()
这段代码会按C列分组(对应df1的列名A、B等),每个组内将D列作为键、E列作为值生成子字典,最终组合成和你示例结构完全一致的嵌套字典。
应用字典生成期望输出
拿到映射字典后,遍历df1的每一列,用map方法生成对应的新列(原列名+1):
# 为df1添加映射后的新列 for col in df1.columns: df1[f"{col}1"] = df1[col].map(mapping_dict[col])
执行后df1就会包含原列和对应的映射列,完全符合你的期望输出格式。
替代方案
如果不想用嵌套字典,也可以将df2转换为宽表后与df1拼接,但这种方式在处理大数据集时效率不如字典映射,且对数据顺序有严格要求:
import pandas as pd # 将df2转为宽表格式 df2_wide = df2.pivot(index='D', columns='C', values='E').rename(columns=lambda x: f"{x}1").reset_index(drop=True) # 拼接df1和转换后的df2 result = pd.concat([df1, df2_wide], axis=1)
注意:此方法要求df1的每行值顺序必须与df2中D列的唯一值顺序完全一致,否则会出现映射错误。相比之下,字典映射的容错性和灵活性更强,更适合你的场景。
内容的提问来源于stack exchange,提问作者cmb66
相关产品推荐
相关产品推荐

