如何按指定格式合并多个DataFrame?求简便实现方案
简单解决DataFrame合并问题:按行填充缺失type值
看起来你想实现的是按行对齐三个DataFrame,保留每个行里唯一非空的type值,其实不用复杂的分组操作,利用pandas的combine_first方法就能轻松搞定,思路如下:
核心逻辑
因为你的三个DataFrame行索引完全对齐(都是5行,name_a/name_b/name_c列内容也一致),combine_first会自动按索引和列名匹配,用右侧DataFrame的非空值填充左侧DataFrame的缺失值。我们只需要按你期望的优先级调整顺序即可:
- 优先保留
DataFrame 1的type值 - 当
DataFrame 1的type为空时,用DataFrame 3的type填充 - 最后用
DataFrame 2的type填充剩余的空值
代码实现
先模拟你的三个DataFrame:
import pandas as pd # 构造DataFrame 1 df1 = pd.DataFrame({ 'name_a': ['a']*5, 'name_b': ['b']*5, 'name_c': ['c']*5, 'type': ['type_a', None, None, 'type_a', None] }) # 构造DataFrame 2 df2 = pd.DataFrame({ 'name_a': ['a']*5, 'name_b': ['b']*5, 'name_c': ['c']*5, 'type': [None, None, 'type_b', None, None] }) # 构造DataFrame 3 df3 = pd.DataFrame({ 'name_a': ['a']*5, 'name_b': ['b']*5, 'name_c': ['c']*5, 'type': [None, 'type_c', None, None, None] })
然后执行合并:
# 按优先级合并 result = df1.combine_first(df3).combine_first(df2) # 可选:将type列的nan转为空值,和你的期望格式完全匹配 result['type'] = result['type'].where(pd.notnull(result['type']), None)
查看结果:
name_a name_b name_c type 0 a b c type_a 1 a b c type_c 2 a b c type_b 3 a b c type_a 4 a b c None
完全符合你期望的输出格式!
为什么这个方法比分组更简单?
你之前尝试的concat+分组思路是针对行堆叠后去重的场景,但这里的三个DataFrame是行一一对应的,不是堆叠关系,所以直接利用索引对齐的填充方法更高效,代码也更简洁。
内容的提问来源于stack exchange,提问作者Aeria
相关产品推荐
相关产品推荐

