gpt4 book ai didi

Python Pandas 使用条件逻辑合并两个 DataFrame

转载 作者:行者123 更新时间:2023-11-30 22:36:21 26 4
gpt4 key购买 nike

假设我有两个 pandas DataFrame 如下,

df_actual

ID  NAME    PRODUCT CHANNEL ACTUAL
1 A W G 233
1 A W M 4
1 A X G 188
1 A X M 4
1 A Y G 37
1 A Y M 4
1 A Z G 272
1 A Z M 4

df_target

ID  NAME    PRODUCT TARGET
1 A W 289
1 A X 253
1 A Y 36
1 A Z 334

我期望得到如下结果,

ID  NAME    PRODUCT CHANNEL ACTUAL  TARGET  
1 A W G 233 284 <<< 289 * (233/(233+4))
1 A W G 4 5 <<< 289 * (4/(233+4))
1 A X G 188 248 <<< 253 * (188/(248+5))
1 A X G 4 5 <<< 253 * (4/(248+5))
1 A Y M 37 32 …
1 A Y M 4 4 …
1 A Z M 272 329 …
1 A Z M 4 5 …

基本上我想要做的就是向 df_actual 添加一个名为 TARGET 的新列。为了计算 TARGET 列中的值,

  1. 我必须在 df_actual 中获取特定 IDNAMEPRODUCT 的 ACTUALCHANNEL,然后获取相同 IDdf_target 中的 TARGET 值,名称产品与以前一样。
  2. 然后使用每个 CHANNEL 对总 CHANNEL 的贡献来计算每个 CHANNEL 的新 TARGET 值对于某些 IDNAMEPRODUCT

例如,要获取 ID 1、NAME A、PRODUCT W 的新 TARGET 值,和CHANNEL G,我需要使用这个公式289 * (233/(233 + 4))。

  • 289 来自 df_target 中的 TARGET 值。
  • 233 来自 CHANNEL G 的 df_actual 中的 ACTUAL
  • 4 来自 CHANNEL M
  • df_actual 中的 ACTUAL

我的真实数据相当庞大,超过 1 Mio 行。因此,如果您能建议矢量化解决方案,我将非常感激。尽管如此,任何建议将不胜感激。谢谢。

最佳答案

考虑以下矢量化方法:

In [39]: m = df_actual.merge(df_target)

In [40]: m
Out[40]:
ID NAME PRODUCT CHANNEL ACTUAL TARGET
0 1 A W G 233 289
1 1 A W M 4 289
2 1 A X G 188 253
3 1 A X M 4 253
4 1 A Y G 37 36
5 1 A Y M 4 36
6 1 A Z G 272 334
7 1 A Z M 4 334

In [41]: m['TARGET'] = (m.TARGET * m.ACTUAL / m.groupby(['NAME','PRODUCT'])['ACTUAL'].transform('sum')).round()

In [42]: m
Out[42]:
ID NAME PRODUCT CHANNEL ACTUAL TARGET
0 1 A W G 233 284.0
1 1 A W M 4 5.0
2 1 A X G 188 248.0
3 1 A X M 4 5.0
4 1 A Y G 37 32.0
5 1 A Y M 4 4.0
6 1 A Z G 272 329.0
7 1 A Z M 4 5.0

关于Python Pandas 使用条件逻辑合并两个 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44200783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com