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

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使用所需的值执行。
添加回答
举报