python - 添加默认值以在熊猫中合并
问题描述
与本主题类似:在 pandas 中合并表时添加默认值
该主题的答案全部填入NaN
生成的 DataFrame 中,这不是我想要做的。
让我们想象一下以下情况:我有两个数据框df1
和df2
. 这个 DataFrame 中的每一个都可能包含一些Nan
,df1
are'a'
和col1
的列,df2
are的列'a'
和col2
where 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
解决方案
在写这个问题时,我找到了一个可行的解决方案。我仍然认为这是一个有趣的问题。这是获得预期输出的解决方案:
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'
这个合并调用中添加一个,它会给出相同的输出。
推荐阅读
- tomcat - 如何在我的 Debian Sever 上安装 derby 以连接 Tomcat?
- java - 即使更改数据集,RecyclerView 也不会引用
- bash - 如何在期望中转义方括号?
- angular - 单元测试用例检查函数是否被调用
- html - Vue:SCSS 样式未应用于服务,但仅在重新加载时应用
- python - 500:Jupyter Notebok 中的内部服务器错误
- javascript - 存储在 aws polly 上提取的音频,将其存储在 S3 上并将其上传到 Javascript 中的 html 元素上
- java - 在不重新编译的情况下更新损坏的依赖 module-info.java?
- python - Python 正则表达式选择所有不匹配模式的元素
- regex - 替换为正则表达式时,如何将数字附加到匹配组的末尾?