在Pandas中连接两个不同列名时创建的重复记录

2024-09-28 19:04:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,df1,df2,我想在其中连接两个不同的表名。但是,我得到的最终输出记录数呈指数级增长

数据

df1

site planq tr   unit    alias   energy
ny   q1 22      du1     du_cc   10
ny   q1 22      du1     du_cc   10
ny   q1 22      du1     du_cc   10
dc   q2 22      aa1     aa_cc   8
dc   q2 22      aa1     aa_cc   8
dc   q2 22      aa1     aa_cc   8
dc   q2 22      aa1     aa_cc   8

df2

serial  sku type    reason  id
34444   d1  d       ok      ny
34444   d1  d       ok      ny
34444   d1  d       ok      ny
555     a1  a       np      dc
555     a1  a       np      dc

所需的

site    planqtr unit    alias   energy  serial  sku type    reason  id
ny      q1 22   du1     du_cc   10      34444   d1  d       ok      ny
ny      q1 22   du1     du_cc   10      34444   d1  d       ok      ny
ny      q1 22   du1     du_cc   10      34444   d1  d       ok      ny
dc      q2 22   aa1     aa_cc   8       555     a1  a       np      dc
dc      q2 22   aa1     aa_cc   8       555     a1  a       np      dc
dc      q2 22   aa1     aa_cc   8       NaN     NaN NaN     NaN     NaN
dc      q2 22   aa1     aa_cc   8       NaN     NaN NaN     NaN     NaN

join = pd.merge(df1, df2, how='left',left_on= ['id'], right_on = ['site'])

但是,我得到的最终输出记录数呈指数级增长。我不确定为什么输出显示数千行输出。如有任何建议,我们将不胜感激


Tags: a1npoknandcaaccd1
2条回答

更新:

我想你不清楚这个要求。我仔细查看了这些记录,联接无法提供所需的输出

不过,我可以使用concat帮助您获得所需的输出。但我不确定这是否符合你的主要目的。不管怎样,这是代码:

pd.concat([df1,df2],axis=1)

输出:

    site planq  tr  unit    alias   energy  serial  sku type    reason  id
0   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
1   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
2   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
3   dc  q2  22  aa1 aa_cc   8   555     a1  a   np  dc
4   dc  q2  22  aa1 aa_cc   8   555     a1  a   np  dc
5   dc  q2  22  aa1 aa_cc   8   NaN    NaN  NaN NaN NaN
6   dc  q2  22  aa1 aa_cc   8   NaN    NaN  NaN NaN NaN

PS:忽略标题的间距

旧答案:

你需要做什么

join = pd.merge(df1, df2, how='left',left_on= ['site'], right_on = ['id'])

left_on参数对应于左侧的数据,反之亦然

说明:

两者之间的区别在于concat只是将两个数据帧并排放置(如果传递axis=1,而如果传递axis=0,则将它们放在自上而下的位置),而merge则完全不同

合并就像笛卡尔积。仅当数据帧的两行之间存在连接点(基于您提供的onleft-onright-on))时,它才会连接它们。如果有多个这样的连接点,会发生什么???输出“会爆炸”。例如,在您的案例中,站点列和“id”列中有多个“ny”。如果您加入,它实际做的是将每个“ny”连接到每个其他可能的“ny”,这样您总共有3x3=9行。请参见下面的合并输出:

合并输出:

    site    planq   tr  unit    alias   energy  serial  sku type    reason  id
0   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
1   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
2   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
3   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
4   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
5   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
6   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
7   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
8   ny  q1  22  du1 du_cc   10  34444   d1  d   ok  ny
9   dc  q2  22  aa1 aa_cc   8   555 a1  a   np  dc
10  dc  q2  22  aa1 aa_cc   8   555 a1  a   np  dc
11  dc  q2  22  aa1 aa_cc   8   555 a1  a   np  dc
12  dc  q2  22  aa1 aa_cc   8   555 a1  a   np  dc
13  dc  q2  22  aa1 aa_cc   8   555 a1  a   np  dc
14  dc  q2  22  aa1 aa_cc   8   555 a1  a   np  dc
15  dc  q2  22  aa1 aa_cc   8   555 a1  a   np  dc
16  dc  q2  22  aa1 aa_cc   8   555 a1  a   np  dc

类似地,您可以看到,对于“dc”上的merged行,总共有4x2=8个结果行。因此,它总共有17行,因此“爆炸”xD

您在如何加入表格方面碰巧有一个小的输入错误。使用正确的联接索引尝试以下代码

res = df1.merge(df2,how='left',right_on=['id'], left_on=['site'])

相关问题 更多 >