首页 > 解决方案 > 添加默认值以在熊猫中合并

问题描述

与本主题类似:在 pandas 中合并表时添加默认值

该主题的答案全部填入NaN生成的 DataFrame 中,这不是我想要做的。

让我们想象一下以下情况:我有两个数据框df1df2. 这个 DataFrame 中的每一个都可能包含一些Nandf1are'a'col1的列,df2are的列'a'col2where col1 和 col2 是不相交的列名列表(例如 df1 和 df2 可以分别具有'a', 'b', 'c''a', 'd', 'e'作为列名)。我想执行左合并,df1并用默认值df2填充该合并的所有缺失值(任何行的df1'a'值不是'a'df2 中列的值)。我们可以想象我有一个default_values匹配任何元素col2到默认值的字典。

给你一个具体的例子:

df1
   a         b         c
0  0  0.038108  0.961687
1  1  0.107457  0.616689
2  2  0.661485  0.240353
3  3  0.457169  0.560912
4  5  5.000000  5.000000

df2
   a         d         e
0  0  0.405170  0.934776
1  1  0.684532  0.168738
2  2  0.729693  0.967310
3  3  0.844770       NaN
4  4  0.842673  0.941324

default_values = {'d':42, 'e':43}

预期输出:

   a         b         c         d         e
0  0  0.038108  0.961687  0.405170  0.934776
1  1  0.107457  0.616689  0.684532  0.168738
2  2  0.661485  0.240353  0.729693  0.967310
3  3  0.457169  0.560912  0.844770       NaN
4  5  5.000000  5.000000        42        43

标签: pythonpandasdataframe

解决方案


在写这个问题时,我找到了一个可行的解决方案。我仍然认为这是一个有趣的问题。这是获得预期输出的解决方案:

df3 = pd.DataFrame(default_values,
                   index = df1.set_index('a').index.difference(df2.a))
df3['a'] = df3.index
df1.merge(pd.concat((df2, df3), sort=False))

此解决方案适用于左/右合并,并且可以扩展为适用于外部合并(也可以通过完成第一个数据帧)。

编辑:how='left'在我的合并中未指定该参数,因为我正在合并的 DataFrame 被构造为在其自己的列“a”中具有 df1 中列“a”的所有值。我们可以在how='left'这个合并调用中添加一个,它会给出相同的输出。


推荐阅读