【发布时间】:2018-12-21 20:19:47
【问题描述】:
我正在尝试基于一个公共列合并几个 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 文档的审核,但没有任何进展。
【问题讨论】:
-
我想你在找
update -
更新仅在索引上对齐,该索引很可能不会相同,并且不允许更新不在原始 DataFrame 中的列。
-
@Epic_Test 可以尝试使用
pd.merge(df1,df_other,how='outer').groupby('Company Name').first().reset_index()。这不是最有效的方法,但没有更多关于为什么要这样做的上下文,它应该足够好。例如,您能否首先连接循环中的所有其他数据帧,然后合并到df1,或者您需要在每个循环中更新df1以执行任何代码? -
@Ben.T 这与我正在寻找的完全一样。我正在解决它以确保没有任何意外的影响。如果您想将此作为答案,我将标记为已接受的答案。我可以接受这不是最有效的过程。我正在运行的循环需要我在迭代时添加到主 df,而不是一次完成所有操作,而且当时我不知道将发生多少次迭代或将出现哪些列。感谢您的帮助!
标签: python python-3.x pandas