如何在不重复列的情况下合并 Pandas 数据框
Posted
技术标签:
【中文标题】如何在不重复列的情况下合并 Pandas 数据框【英文标题】:How to merge Pandas dataframes without duplicating columns 【发布时间】:2019-06-26 12:25:07 【问题描述】:我有以下形式的数据:
frame1 = pd.DataFrame('supplier1_match0': ['x'], 'id': [1])
frame2 = pd.DataFrame('supplier1_match0': ['2x'], 'id': [2])
并希望像这样将多个框架连接到一个框架:
base_frame = pd.DataFrame('id':[1,2,3])
我在 id 上合并并得到:
merged = base_frame.merge(frame1, how='left', left_on='id', right_on='id')
merged = merged.merge(frame2, how='left', left_on='id', right_on='id')
id supplier1_match0_x supplier1_match0_y
0 1 x NaN
1 2 NaN 2x
2 3 NaN NaN
列被复制并附加了一个“y”。这是我需要的:
id, supplier1_match0, ...
1, x
2, 2x
3, NaN
有没有简单的方法来实现这一点?有一个类似的问题 (Nested dictionary to multiindex dataframe where dictionary keys are column labels),但数据的形状不同。请注意,我有多个供应商并且他们有不同数量的匹配项,所以我不能假设数据将具有“矩形”形状。提前致谢。
【问题讨论】:
索引的长度和顺序是否相同? 【参考方案1】:newdf_merge= pd.merge(pd.DataFrame(df1), pd.DataFrame(df2), left_on=['common column name from df1'],right_on=['common column name from df2'],how='left')
它对我有用,因此想在这里分享它
【讨论】:
【参考方案2】:你的问题是你真的不想只是merge
一切。你需要concat
你的第一组帧,然后合并。
import pandas as pd
import numpy as np
base_frame.merge(pd.concat([frame1, frame2]), how='left')
# id supplier1_match0
#0 1 x
#1 2 2x
#2 3 NaN
或者,您可以定义base_frame
,使其包含其他框架的所有相关列,并将id
设置为索引并使用.update
。这确保了base_frame
的大小保持不变,而上面的大小则不然。尽管如果给定单元格有多个非空值,则数据将被覆盖。
base_frame = pd.DataFrame('id':[1,2,3]).assign(supplier1_match0 = np.NaN).set_index('id')
for df in [frame1, frame2]:
base_frame.update(df.set_index('id'))
print(base_frame)
supplier1_match0
id
1 x
2 2x
3 NaN
【讨论】:
完美,谢谢!我不知道 DataFrame.update以上是关于如何在不重复列的情况下合并 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章
如何在不添加“Row.names”列的情况下按行名合并数据框?
如何在不转换列的情况下更改 MySQL 中的表(默认)排序规则[重复]