在Python中合并DataFrame,而无需复制列

时间:2018-12-21 20:19:48

标签: python python-3.x pandas

我正在尝试基于一个公共列合并几个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  Data2
0            A      1     13
1            B     34     54
2            C     23   5354
3            D     66    443

第二个DataFrame,其中包含一些公司的其他信息:

pd.DataFrame({'Company Name':['A','B'],'Address':  ['str1', 'str2'], 'Phone': ['str1a', 'str2a']})

  Company Name Address  Phone
0            A    str1  str1a
1            B    str2  str2a

如果我想将两者结合起来,它将使用on = Column成功合并为一个:

df1=pd.merge(df1,df2, on='Company Name', how='outer')

  Company Name  Data1  Data2 Address  Phone
0            A      1     13    str1  str1a
1            B     34     54    str2  str2a
2            C     23   5354     NaN    NaN
3            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_y
0            A      1     13      str1   str1a       NaN     NaN
1            B     34     54      str2   str2a       NaN     NaN
2            C     23   5354       NaN     NaN      str3   str3a
3            D     66    443       NaN     NaN       NaN     NaN

当我真正想要的是一个具有相同列的DataFrame时,只需填充所有丢失的数据即可。

  Company Name  Data1  Data2 Address  Phone
0            A      1     13    str1  str1a
1            B     34     54    str2  str2a
2            C     23   5354    str3  str3a
3            D     66    443     NaN    NaN

先谢谢了。我已经在重复的栏目中查看了之前在此处提出的问题,并对Pandas文档进行了回顾,没有任何进展。

2 个答案:

答案 0 :(得分:1)

当您希望在一个循环中同时合并一个数据框时,可以采用以下方法:新数据框是否具有新的公司名称,是否具有新的列:

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,它会保留最后一个有效值,而不是每个组的每一列中的第一个值,它取决于您需要的数据,{{ 1}}或df1中的一个(如果有)。在上面的示例中,它没有任何改变,但是在以下情况下,您将看到:

df_other

答案 1 :(得分:0)

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

note1;为了能够使用df.update,您必须set_index'Company Name',此功能将检查df1是否一次通过,并下次通过。添加的df的索引将设置为'Company Name'

note2;接下来,该功能将检查是否有新列,添加它们并填写列名(您可能要更改它)。

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