使用重复键值从另一个数据框中分配列值
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
来匹配df
和df1
,这样我就可以使用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')
请在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
来匹配df
和df1
,这样我就可以使用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')