在两个熊猫数据框中查找值并创建新列

时间:2020-05-01 12:55:29

标签: python pandas merge lookup concat

我的问题中有两个数据框。

df1

ID      Value
 1      A
 2      B
 3      C

df2:

ID      F_ID     S_ID
1       2        3
2       3        1
3       1        2

我想在每个ID列旁边创建一个列,该列将存储从df1查找的值。输出应如下所示:

ID  ID_Value     F_ID  F_ID_Value   S_ID  S_ID_Value
1     A             2   B              3       C
2     B             3   C              1       A
3     C             1   A              2       B

基本上从df1查找并创建一个新列来存储这些值。

2 个答案:

答案 0 :(得分:1)

您可以在df2的每一列上使用map,其值为df1

s = df1.set_index('ID')['Value']
for col in df2.columns:
    df2[f'{col}_value'] = df2[col].map(s)
print (df2)
   ID  F_ID  S_ID ID_value F_ID_value S_ID_value
0   1     2     3        A          B          C
1   2     3     1        B          C          A
2   3     1     2        C          A          B

或带有applyconcat

df_ = pd.concat([df2, df2.apply(lambda x: x.map(s)).add_prefix('_value')], axis=1)
df_ = df_.reindex(sorted(df_.columns), axis=1)

答案 1 :(得分:1)

如果顺序很重要(我意识到自己不在注释中),则必须使用DataFrame.insert并进行枚举和一些数学运算:

s = df1.set_index('ID')['Value']

for i, col in enumerate(df2.columns, 1):
    df2.insert(i * 2 - 1, f'{col}_value', df2[col].map(s))
print (df2)
   ID ID_value  F_ID F_ID_value  S_ID S_ID_value
0   1        A     2          B     3          C
1   2        B     3          C     1          A
2   3        C     1          A     2          B