import pandas as pd

df_all = pd.DataFrame(columns=["uid", "a", "b"], data=[["uid1", 12, 15],
                                                    ["uid2", 13, 16],
                                                    ["uid3", 14, 17],
                                                    ["uid4", 15, 18]])

df_additional_info1 = pd.DataFrame(columns=["uid", "c", "d"], data=[["uid1", 12, 15],
                                                                   ["uid3", 14, 17]])

df_additional_info2 = pd.DataFrame(columns=["uid", "c", "d"], data=[["uid2", 12, 15]])

我需要合并df_all两次与额外的信息.首先使用df_additional_info1,然后使用df_additional_info2,依此类推.They will always contain additional info for already existing rows and only for those rows that were not yet updated.

当我执行以下操作时:

df_all = df_all.merge(df_additional_info1, how="left", on="uid")
df_all = df_all.merge(df_additional_info2, how="outer", on="uid")

我得到重复的列(*_x,*_y):

what I get

But I need this what I need

有什么建议吗?

推荐答案

另一种可能的解决方案是:

(pd.concat([df_all.set_index('uid'), df_additional_info1.set_index('uid'),
            df_additional_info2.set_index('uid')])
 .stack().unstack().reset_index())

或者,

(df_additional_info2.set_index('uid')
 .combine_first(
     pd.concat([df_all.set_index('uid'), 
                df_additional_info1.set_index('uid')], axis=1))
 .reset_index())

解释:

代码首先将uid设置为所有DataFrame的索引,以方便合并操作.它使用pd.concat()沿着列轴连接df_alldf_additional_info1,将df_additional_info1‘S列附加到df_all,并创建包含这两个列的所有列的DataFrame,用NaN填充df_additional_info1中缺少的uids.然后,combine_first()用连接的DataFrame中的值替换df_additional_info2中的任何空值,实质上是用来自df_alldf_additional_info1的数据(基于uid)填充df_additional_info2‘S空白.最后一步,reset_index(),将uid移回常规列并重新建立默认整数索引,生成具有所有可用附加信息的合并的DataFrame.


输出:

    uid   a   b     c     d
0  uid1  12  15  12.0  15.0
1  uid2  13  16  12.0  15.0
2  uid3  14  17  14.0  17.0
3  uid4  15  18   NaN   NaN

Python相关问答推荐

如何检测背景有噪的图像中的正方形

删除所有列值,但判断是否存在任何二元组

在Mac上安装ipython

关于Python异步编程的问题和使用await/await def关键字

Odoo 16使用NTFS使字段只读

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

创建可序列化数据模型的最佳方法

将scipy. sparse矩阵直接保存为常规txt文件

为什么'if x is None:pass'比'x is None'单独使用更快?

Polars map_使用多处理对UDF进行批处理

如何在Python请求中组合多个适配器?

将一个双框爆炸到另一个双框的范围内

以异步方式填充Pandas 数据帧

如何使用matplotlib查看并列直方图

如何用FFT确定频变幅值

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

利用SCIPY沿第一轴对数组进行内插

普洛特利express 发布的人口普查数据失败

#将多条一维曲线计算成其二维数组(图像)表示

多个布尔条件的`jax.lax.cond`等效项