Pandas合并DataFrame:如何保留固定列结构(含缺失列)
Pandas 固定列填充:用列数不固定的DataFrame填充目标DataFrame
解决方案
你可以通过两种简洁的方式实现需求,核心是对齐group列并保留目标DataFrame的固定列结构:
方法1:使用merge + 列覆盖
先按group列左合并两个DataFrame,确保保留目标DataFrame的所有行和列,再用数据DataFrame的对应列值覆盖目标列:
import pandas as pd # 构造目标DataFrame(固定列结构) target_df = pd.DataFrame({ 'group': ['A', 'B', 'C'], 'USD': [None]*3, 'EUR': [None]*3, 'GBP': [None]*3 }) # 构造示例数据DataFrame(列数不固定,此处无GBP列) data_df = pd.DataFrame({ 'group': ['A', 'B', 'C'], 'USD': [None, 0.04, 0.02], 'EUR': [0.05, None, None] }) # 左合并,保留target_df的所有列,合并后重复列加后缀区分 merged = target_df.merge(data_df, on='group', how='left', suffixes=('_orig', '')) # 遍历币种列,用合并后的新值覆盖原列 for col in ['USD', 'EUR', 'GBP']: if col in merged.columns: target_df[col] = merged[col] print(target_df)
输出结果:
group USD EUR GBP 0 A NaN 0.05 NaN 1 B 0.04 NaN NaN 2 C 0.02 NaN NaN
方法2:使用set_index + combine_first
将group设为索引实现对齐,利用combine_first直接用数据DataFrame的非空值填充目标DataFrame,自动保留目标列结构:
import pandas as pd # 构造目标和数据DataFrame(同上) target_df = pd.DataFrame({ 'group': ['A', 'B', 'C'], 'USD': [None]*3, 'EUR': [None]*3, 'GBP': [None]*3 }) data_df = pd.DataFrame({ 'group': ['A', 'B', 'C'], 'USD': [None, 0.04, 0.02], 'EUR': [0.05, None, None] }) # 将group设为索引,实现按组对齐 target_idx = target_df.set_index('group') data_idx = data_df.set_index('group') # 用数据DF填充目标DF,保留目标DF的所有列 result = data_idx.combine_first(target_idx).reset_index() print(result)
输出结果和方法1完全一致,此方法更简洁,适合group列唯一的场景。
关键说明
- 两种方法都会自动保留
USD、EUR、GBP三列,即使数据DataFrame缺少某列,对应列会保留缺失值(NaN)。 - Pandas中
None会自动转换为标准缺失值NaN,这是正常的内部处理逻辑。
内容的提问来源于stack exchange,提问作者Chendo
相关产品推荐
相关产品推荐

