使用重复键值从另一个数据框中分配列值

Assign column values from another dataframe with repeating key values

请在Pandas中帮助我,我找不到好的解决方案 尝试过映射、分配、合并、连接、set_index。 可能是我太累了:)

df:

   m_num  A  B
0      1  0  9
1      1  1  8
2      2  2  7
3      2  3  6
4      3  4  5
5      3  5  4

df1:

   m_num   C
0      2  99
1      2  88

df_final:

   m_num  A  B  C
0      1  0  9  NaN
1      1  1  8  NaN
2      2  2  7  99
3      2  3  6  88
4      3  4  5  NaN
5      3  5  4  NaN

尝试:

df2 = df[df['m_num'].isin(df1['m_num'])].reset_index(drop=True)
df2 = pd.merge(df2,df1,on=[df1.index,'m_num']).drop('key_0',axis=1)
df2 = pd.merge(df,df2,on=['m_num','A','B'],how='left')
print(df2)

打印:

   m_num  A  B     C
0      1  0  9   NaN
1      1  1  8   NaN
2      2  2  7  99.0
3      2  3  6  88.0
4      3  4  5   NaN
5      3  5  4   NaN

解释:

可能有更好的解决方案,但这是我的思考过程。从某种意义上说,这个问题有点棘手,因为 'm_num' 是唯一的公共键,而且它有重复的值。

所以我首先在这里创建了一个dataframe来匹配dfdf1,这样我就可以使用index作为后续合并的另一个键。

df2 = df[df['m_num'].isin(df1['m_num'])].reset_index(drop=True)

这会打印:

   m_num  A  B
0      2  2  7
1      2  3  6

正如您在上面看到的,现在除了 m_num 之外,我们还有索引 0 和 1 作为我们可以用来与 df1 匹配的键。

df2 = pd.merge(df2,df1,on=[df1.index,'m_num']).drop('key_0',axis=1)

这会打印:

   m_num  A  B   C
0      2  2  7  99
1      2  3  6  88

然后将上面的结果 dataframe 与原来的 df 进行左连接以获得输出。

df2 = pd.merge(df,df2,on=['m_num','A','B'],how='left')