合并两个数据框并根据匹配添加特定的列值

时间:2021-05-26 15:32:25

标签: python-3.x pandas

我有两个这样的数据框:

DF1

product_name        cost  Account  Acc_no
prod1               200   NA-STG   1264509
prod2               500   NA-STG   1264509
prod3               800   NA-STG   1264509
prod5               300   NA-STG   1264509
prod3               804   NA-DEV   1264345
prod4               511   NA-DEV   1264345
prod5               308   NA-DEV   1264345

df2:

product_name        active_subscription distributed_cost  account_alias
prod1                   20              1299.498484       NA-STG
prod2                   50              3248.746211       NA-STG
prod3                   80              5197.993937       NA-STG
prod4                   80              97.993937         NA-STG
prod4                   32              1000              NA-DEV

我想将 df2 中的分布式成本添加到基于 df1 的帐户中。如果 df1 中缺少 df2 中的任何产品(例如:df1 中缺少 prod4),则必须在 df1 中添加相应的记录。所以我想要的输出是:

product_name        cost          Account
prod1               1499.498484   NA-STG
prod2               3748.746211   NA-STG
prod3               5997.993937   NA-STG
prod4               97.993937     NA-STG
prod5               300           NA-STG
prod3               804           NA-DEV
prod4               1511          NA-DEV
prod5               308           NA-DEV

我怎样才能有效地实现这一点?

2 个答案:

答案 0 :(得分:1)

执行以下步骤来实现它:

  1. 在两个 DF 中使用 product_namesaccount 各自的列对您的数据帧执行外部 merge
  2. 填写帐户列中的缺失值(因为有些值在DF2中但不在DF1中)。
  3. 添加 costdistributed_cost 值。
  4. 最后选择要获取最终数据框的列。

代码:

df = df1.merge(df2, right_on=['product_name','account_alias'], left_on=['product_name','Account'], how='outer')
df['Account'] = df['Account'].fillna(df['account_alias'])
df['cost'] = df['cost'].fillna(0) + df['distributed_cost'].fillna(0)
df = df.loc[:, ['product_name','cost', 'Account']]

输出

>>> df.sort_values(['Account', 'product_name'], ascending=[False,True])
  product_name         cost Account
0        prod1  1499.498484  NA-STG
1        prod2  3748.746211  NA-STG
2        prod3  5997.993937  NA-STG
7        prod4    97.993937  NA-STG
3        prod5   300.000000  NA-STG
4        prod3   804.000000  NA-DEV
5        prod4  1511.000000  NA-DEV
6        prod5   308.000000  NA-DEV

答案 1 :(得分:1)

您可以将 pd.concat()groupby 结合使用以获得结果,如下所示:

pd.concat([
     df1.drop('Acc_no',axis=1),
     (df2.drop('active_subscription',axis=1)).rename({'distributed_cost':'cost','account_alias':'Account'},axis=1)]) \
    .groupby(['product_name','Account'])['cost'].sum() \
    .reset_index() \
    .sort_values(['Account','product_name'],ascending=[False,True]
)

打印:

  product_name Account         cost
0        prod1  NA-STG  1499.498484
1        prod2  NA-STG  3748.746211
3        prod3  NA-STG  5997.993937
5        prod4  NA-STG    97.993937
7        prod5  NA-STG   300.000000
2        prod3  NA-DEV   804.000000
4        prod4  NA-DEV  1511.000000
6        prod5  NA-DEV   308.000000