在python中合并后更改数据的形状

时间:2018-11-29 12:00:05

标签: python pandas merge

我有两个数据帧,它们的形状分别为df1(220545,3)和df2(462,11)。 在此交叉列中是广告系列ID,df1具有63个唯一ID,df2具有147个ID。当我尝试在广告系列ID上将df2与df1合并时,尺寸更改为(248949,13)。我也想为新的合并数据框使用df1形状。

我用于合并的代码是

m=df1.merge(df2, on=['Campaign ID'],how='inner')
m=m.drop_duplicates(keep=False)

请提出一些建议以获取准确的输出。

2 个答案:

答案 0 :(得分:0)

如果要保留左侧数据框,则必须进行左侧联接(how ='left')。而不是必须将可能的重复项放在像idx这样的唯一行上。否则,像您一样使用内部联接,您将获得以下数据框:

df1 = pd.DataFrame([(f't{x}', f'a{x}') for x in range(0,5)], columns=['idx', 'a'])

    idx a
0   t0  a0
1   t1  a1
2   t2  a2
3   t3  a3
4   t4  a4

df2 = pd.DataFrame([(f't{x%2}', f'b{x}') for x in range(0,5)], columns=['idx', 'b'])

    idx b
0   t0  b0
1   t1  b1
2   t0  b2
3   t1  b3
4   t0  b4

df_result = pd.merge(df1, df2, on='idx)

    idx a   b
0   t0  a0  b0
1   t0  a0  b2
2   t0  a0  b4
3   t1  a1  b1
4   t1  a1  b3

如果仅执行drop_duplicates(),则将无法正常工作,因为您没有如示例所示完全重复的行。

答案 1 :(得分:0)

我假设你说

“我也希望新合并的数据框具有df1形状。”

您的意思是您想要一个与df1具有相同行数和列数的数据框。在这种情况下,如果不从df2引入任何新列,为什么要加入df2?

除非另有说明,否则在merge语句中,所有列将从df1和df2引入到结果df中。

因此,您可以将要从df1和df2引入的列显式指定为:

m = df1 [['col1','col2',....]]。merge(df2 [[''col3','col4',...]],on = ['广告系列ID'] ,how ='inner')

由于您明确指定了列名称(“ col1”,“ col2”),因此将带入所需的列。

关于保持行数相同,由于活动ID在两个表中都不唯一,因此您将具有笛卡尔积,这意味着df1中特定活动ID的一个实例可以链接到df2中的多行。如果希望行数相同,则必须确保df1中的广告系列ID仅与df2中的Campaign ID的一个实例匹配。同样,一旦您确定df1中的一个Campaign ID仅与df2中的一个Campaign ID相匹配,您就想使用左连接(不是内部连接)来确保df2中没有Campaign的行不会丢失。