pandas:顺序合并添加新列而不是替换NaN值

8zzbczxx  于 2023-06-20  发布在  其他
关注(0)|答案(2)|浏览(105)
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,依此类推。它们将始终包含已存在行的附加信息,并且仅包含尚未更新的行的附加信息。
当我执行以下操作时:

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):

但我需要这个

有什么建议吗?

webghufk

webghufk1#

另一种可能的解决方案:

(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设置为所有DataFrames的索引,以便于合并操作。它使用pd.concat()沿着列轴连接df_alldf_additional_info1,将df_additional_info1的列附加到df_all上,并创建一个包含这两个列的DataFrame,并填充NaN,因为df_additional_info1中没有的uidscombine_first()然后用来自级联 Dataframe 的值替换df_additional_info2中的任何空值,基本上基于uid用来自df_alldf_additional_info1的数据填充df_additional_info2的间隙。最后一步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
gojuced7

gojuced72#

您可以.concat附加信息帧:

df_all.merge(
   pd.concat([df_additional_info1, df_additional_info2]),
   how = "left"
)
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

相关问题