使用多个键列合并数据框

3
我想合并这个数据框:
import pandas as pd
import numpy as np

df1 = pd.DataFrame([[1,10,100],[2,20,np.nan],[3,30,300]], columns=["A","B","C"])
df1
   A   B    C
0  1  10  100
1  2  20  NaN
2  3  30  300

使用这个:

df2 = pd.DataFrame([[1,422],[10,72],[2,278],[300,198]], columns=["ID","Value"])
df2
    ID  Value
0    1    422
1   10     72
2    2    278
3  300    198

获取输出:

df_output = pd.DataFrame([[1,10,100,422],[1,10,100,72],[2,20,200,278],[3,30,300,198]], columns=["A","B","C","Value"])
df_output 
   A   B    C  Value
0  1  10  100    422
1  1  10  100     72
2  2  20  NaN    278
3  3  30  300    198

这个想法是,对于df2,关键列是“ID”,而对于df1,我们有3个可能的关键列["A","B","C"]。

请注意,df2中的数字之所以选成这样是为了简单起见,在实践中它们可以包含随机数。

我如何执行这样的合并?谢谢!


你能解释一下如何为第一行生成C值吗?它们的行数相同吗? - Moun
1个回答

3

据我所知,您需要双重合并/连接。

首先,用melt函数将df1转换为单个列,同时保留索引。然后使用merge函数获取匹配结果。最后,将匹配结果使用join函数与原始数据框连接。

s = (df1
     .reset_index().melt(id_vars='index')
     .merge(df2, left_on='value', right_on='ID')
     .set_index('index')['Value']
    )

# index
# 0    422
# 1    278
# 0     72
# 2    198
# Name: Value, dtype: int64

df_output = df1.join(s)

输出:

   A   B      C  Value
0  1  10  100.0    422
0  1  10  100.0     72
1  2  20    NaN    278
2  3  30  300.0    198

使用stack + map实现备选方案:

s = df1.stack().droplevel(1).map(df2.set_index('ID')['Value']).dropna()
df_output = df1.join(s.rename('Value'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接