首页 > 解决方案 > 在多对一/多上使用合并

问题描述

我在下面有两个数据框,我想将它们合并以获取 df1 上的 ID。但是,我发现通过使用合并,如果名称不止一个,我将无法获取 ID。df2 具有唯一的名称,df1 和 df2 的行和列不同。我的代码如下:

df1:

   Name Region
0  P    Asia
1  Q    Eur
2  R    Africa
3  S    NA
4  R    Africa
5  R    Africa
6  S    NA

df2:

   Name  Id
0  P     1234
1  Q     1244
2  R     1233

代码:

x= df1.assign(temp1 = df1.groupby ('Name').cumcount())
y= df2.assign(temp1 = df2.groupby ('Name').cumcount())
xy= x.merge(y, on=['Name',temp2],how = 'left').drop(columns = ['temp1'])

xy 的输出如下,如何找到那些 NAN 的 Id?

   Name Region Id
0  P    Asia   1234
1  Q    Eur    1244
2  R    Africa NAN
3  S    NA     NAN
4  R    Africa NAN
5  R    Africa NAN
6  S    NA     NAN

标签: pythonpython-3.xpandas

解决方案


  1. 您的语法已关闭 on temp2。首先,你忘记了引号。其次,它应该'temp1'代替temp2.
  2. 您合并了两列。如果您只合并Id,那么您将没有NaN价值。但是,由于您在 上合并temp1,因此有一些数据在数据帧中不匹配。第二个数据框中的列中没有SName,因此您希望合并后NaN的值。S
  3. 如果您的目标是现在填充这些NaN值但使用不同的方法,那么您可以做到这一点。这就是你想要做的,现在只需合并Id而不是Idand temp1。你是这个意思吗?

x= df1.assign(temp1 = df1.groupby ('Name').cumcount())
y= df2.assign(temp1 = df2.groupby ('Name').cumcount())
xy= x.merge(y, on=['Name','temp1'],how='left').drop('temp1')
xy
Out[1]: 
  Name  Region        Id
0    P    Asia    1234.0
1    Q     Eur    1244.0
2    R  Africa    1233.0
3    S     NaN       NaN
4    R  Africa       NaN
5    R  Africa       NaN
6    S     NaN       NaN

推荐阅读