【问题标题】:Looking up values in two pandas data frames and create new columns在两个 pandas 数据框中查找值并创建新列
【发布时间】:2020-05-01 12:55:29
【问题描述】:

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

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 查找并创建一个新列来存储这些值。

【问题讨论】:

  • 顺序不重要?
  • @jezrael:顺序并不重要。但问题已经回答了!
  • yop,我问是因为与预期输出的女巫顺序不匹配,如果没有问题就OK

标签: python pandas merge lookup concat


【解决方案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)

【讨论】:

    【解决方案2】:

    如果顺序很重要(我意识到不在 cmets 中)是必要的,请使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 2022-11-18
      • 2019-04-16
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多