为了账号安全,请及时绑定邮箱和手机立即绑定

在不重复列的情况下在 Python 中合并数据帧

在不重复列的情况下在 Python 中合并数据帧

吃鸡游戏 2021-09-23 09:18:36
我正在尝试基于一个公共列合并多个 DataFrame。这将在循环中完成,原始 DataFrame 可能没有所有列,因此需要外部合并。但是,当我对几个不同的 DataFrames 列重复后缀 _x 和 _y 执行此操作时。我正在寻找一个 DataFrame,其中填充了数据,并且仅在以前不存在的情况下才添加列。df1=pd.DataFrame({'Company Name':['A','B','C','D'],'Data1':[1,34,23,66],'Data2':[13,54,5354,443]})      Company Name  Data1  Data20            A      1     131            B     34     542            C     23   53543            D     66    443第二个 DataFrame 包含一些公司的附加信息:pd.DataFrame({'Company Name':['A','B'],'Address':  ['str1', 'str2'], 'Phone': ['str1a', 'str2a']})  Company Name Address  Phone0            A    str1  str1a1            B    str2  str2a如果我想将这两者结合起来,它将使用 on=Column 成功合并为一个:df1=pd.merge(df1,df2, on='Company Name', how='outer')  Company Name  Data1  Data2 Address  Phone0            A      1     13    str1  str1a1            B     34     54    str2  str2a2            C     23   5354     NaN    NaN3            D     66    443     NaN    NaN但是,如果我要在循环中再次执行相同的命令,或者如果我要与具有其他公司信息的另一个 DataFrame 合并,我最终会得到类似于以下内容的重复列:df1=pd.merge(df1,pd.DataFrame({'Company Name':['C'],'Address':['str3'],'Phone':['str3a']}), on='Company Name', how='outer')  Company Name  Data1  Data2 Address_x Phone_x Address_y Phone_y0            A      1     13      str1   str1a       NaN     NaN1            B     34     54      str2   str2a       NaN     NaN2            C     23   5354       NaN     NaN      str3   str3a3            D     66    443       NaN     NaN       NaN     NaN当我真正想要的是一个具有相同列的 DataFrame 时,只需填充任何缺失的数据。  Company Name  Data1  Data2 Address  Phone0            A      1     13    str1  str1a1            B     34     54    str2  str2a2            C     23   5354    str3  str3a3            D     66    443     NaN    NaN提前致谢。我已经回顾了之前在重复专栏上提出的问题,以及对 Pandas 文档的回顾,但没有任何进展。
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

当您在循环中寻找一次合并一个数据框时,您可以通过以下方式进行操作,即新数据框是否具有新公司名称,是否具有新列:


df1 = pd.DataFrame({'Company Name':['A','B','C','D'],

                    'Data1':[1,34,23,66],'Data2':[13,54,5354,443]})

list_dfo = [pd.DataFrame({'Company Name':['A','B'],

                          'Address':  ['str1', 'str2'], 'Phone': ['str1a', 'str2a']}),

            pd.DataFrame({'Company Name':['C'],'Address':['str3'],'Phone':['str3a']})]


for df_other in list_dfo:

    df1 = pd.merge(df1,df_other,how='outer').groupby('Company Name').first().reset_index()

    # and other code

在这个例子的最后:


print(df1)

 Company Name  Data1   Data2 Address  Phone

0            A    1.0    13.0    str1  str1a

1            B   34.0    54.0    str2  str2a

2            C   23.0  5354.0    str3  str3a

3            D   66.0   443.0     NaN    NaN

代替first,您可以使用last,这将保留每组每列中的最后一个有效值而不是第一个,这取决于您需要什么数据,来自df1或来自的数据(df_other如果可用)。在上面的例子中,它没有改变任何东西,但在下面的例子中你会看到:


#company A has a new address

df4 = pd.DataFrame({'Company Name':['A'],'Address':['new_str1']})


#first keep the value from df1

print(pd.merge(df1,df4,how='outer').groupby('Company Name')

        .first().reset_index())

Out[21]: 

  Company Name  Data1   Data2 Address  Phone

0            A    1.0    13.0    str1  str1a   #address is str1 from df1

1            B   34.0    54.0    str2  str2a

2            C   23.0  5354.0    str3  str3a

3            D   66.0   443.0     NaN    NaN


#while last keep the value from df4

print (pd.merge(df1,df4,how='outer').groupby('Company Name')

         .last().reset_index())

Out[22]: 

  Company Name  Data1   Data2   Address  Phone

0            A    1.0    13.0  new_str1  str1a   #address is new_str1 from df4

1            B   34.0    54.0      str2  str2a

2            C   23.0  5354.0      str3  str3a

3            D   66.0   443.0       NaN    NaN


查看完整回答
反对 回复 2021-09-23
?
慕容3067478

TA贡献1773条经验 获得超3个赞

IIUC,你可以试试这个;


def update_df(df1, df_next):

    if 'Company Name' not in list(df1):

        pass

    else:

        df1.set_index('Company Name', inplace=True)

    df_next.set_index('Company Name', inplace=True)   

    new_cols = [item for item in set(df_next) if item not in set(df1)]

    for col in new_cols:

        df1['{}'.format(col)] = col

    df1.update(df_next) 


update_df(df1, df2)

update_df(df1, df3)

df1


              Data1  Data2  Address  Phone

Company Name                              

A                 1     13     str1  str1a

B                34     54     str2  str2a

C                23   5354     str3  str3a

D                66    443  Address  Phone

注1;为了能够使用df.update,你必须set_index要'Company Name',这个功能将检查的df1一次,下一次它会通过。在df加入将有指标集来'Company Name'。


笔记2; 接下来该函数将检查是否有新列,添加它们并填写列名(您可能想要更改它)。


注3;最后,您df.update使用所需的值执行。


查看完整回答
反对 回复 2021-09-23
  • 2 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号