为了账号安全,请及时绑定邮箱和手机立即绑定

在多对一/多上使用合并

在多对一/多上使用合并

陪伴而非守候 2023-09-12 16:43:29
我下面有两个数据框,我想合并它们以获取 df1 上的 ID。但是,我发现通过使用合并,如果名称超过一个,我无法获取 ID。df2 具有唯一的名称,df1 和 df2 的行和列不同。我的代码如下:df1:   Name Region0  P    Asia1  Q    Eur2  R    Africa3  S    NA4  R    Africa5  R    Africa6  S    NAdf2:   Name  Id0  P     12341  Q     12442  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 Id0  P    Asia   12341  Q    Eur    12442  R    Africa NAN3  S    NA     NAN4  R    Africa NAN5  R    Africa NAN6  S    NA     NAN
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

  1. 您的语法已关闭temp2。首先,你忘记了引号。其次,它应该'temp1'代替temp2.

  2. 您合并了两列。如果你只在 上合并Id,那么你就不会有NaN值。但是,由于您在 上合并temp1,因此存在一些数据在数据帧中不匹配。第二个数据帧中的列中没有S值,因此您会期望合并后的值。NameNaNS

  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


查看完整回答
反对 回复 2023-09-12
?
catspeake

TA贡献1111条经验 获得超0个赞

有什么原因不能使用 pandas merge 吗?



name_list = ['P','Q','R','S','R','R','S']

country_list = ['Asia','Eur','Africa','NA','Africa','Africa','NA']


df1 = pd.DataFrame({'Name':name_list,'Region':country_list})

df2 = pd.DataFrame({'Name':['P','Q','R'],'Id':[1234,1244,1233]})


result = pd.merge(df1,df2,on='Name',how='left')

print(result)

输出:


  Name  Region      Id

0    P    Asia  1234.0

1    Q     Eur  1244.0

2    R  Africa  1233.0

3    S      NA     NaN

4    R  Africa  1233.0

5    R  Africa  1233.0

6    S      NA     NaN


查看完整回答
反对 回复 2023-09-12
?
喵喔喔

TA贡献1735条经验 获得超5个赞

你为什么要合并cumcount()?这样,您只需将它们一对一合并。只需合并:


df1.merge(df2, on='Name', how='outer')

输出:


  Name  Region      Id

0    P    Asia  1234.0

1    Q     Eur  1244.0

2    R  Africa  1233.0

3    R  Africa  1233.0

4    R  Africa  1233.0

5    S     NaN     NaN

6    S     NaN     NaN


查看完整回答
反对 回复 2023-09-12
  • 3 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信