我用于合并的代码是
m=df1.merge(df2, on=['Campaign ID'],how='inner')
m=m.drop_duplicates(keep=False)
请提出一些建议以获取准确的输出。
答案 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的行不会丢失。