如何根据与现有值比较的下限和上限创建新的pandas系列

2024-10-06 03:55:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个脚本,根据供应商成本变化更新零售价格

我已经成功地创建了一个脚本,该脚本引入外部供应商数据,匹配内部数据,输出更改,并将这些更改传递到API以更新我们的ERP和工作表,以便我们能够可视化更改。我的最后一个任务是解决零售价格的变化,但我不知道用熊猫解决这个问题的最佳方法

df1(价格变化):

      Cat Nr    Net Cost    Status
 2801   0825646183913   8.50    ACTIVE
 2802   0603497902941   7.96    ACTIVE
 2803   0603497897452   9.35    ACTIVE
 2804   4050538324761   14.45   ACTIVE
 2805   4050538307429   10.20   ACTIVE

df2(价格网格):

    Cost (low)  Cost (upp)  Retail
0   2.00    3.30    5.99
1   3.31    5.00    8.99
2   5.01    6.15    10.99
3   6.16    7.15    12.99
4   7.16    8.15    14.99
5   8.16    9.25    16.99
6   9.26    10.75   18.99
7   10.76   11.50   20.99
8   11.51   12.75   22.99
9   12.76   13.75   24.99
10  13.76   14.75   26.99

所以我想通过比较df1[“净成本”]和df2[“成本(低)”来创建df1[“零售”]&;df2['成本(upp)']和返回df2['零售']

例如,第2801行'Net Cost'==8.50,因此它将返回16.99的'Retail'

df1看起来像:

      Cat Nr    Net Cost    Status    Retail
 2801   0825646183913   8.50    ACTIVE    16.99
 2802   0603497902941   7.96    ACTIVE    14.99
 2803   0603497897452   9.35    ACTIVE    18.99
 2804   4050538324761   14.45   ACTIVE    26.99
 2805   4050538307429   10.20   ACTIVE    18.99

Tags: 数据脚本netstatus价格供应商nrcat
2条回答

您可以选择的另一种方法是创建笛卡尔积并过滤您感兴趣的行。您不需要对数据进行两次排序(这可能代价高昂),但可能需要更多内存

cartesian_product = pd.merge(df1.assign(key=0), df2.assign(key=0), how='outer').drop('key', axis=1)

mask = (cartesian_product['Net Cost'] >= cartesian_product['Cost (low)']) 
       & (cartesian_product['Net Cost'] < cartesian_product['Cost (upp)'])
cartesian_product[mask]

    Cat     Nr              Net Cost Status Cost (low) Cost (Upp) Retail
5   2801    825646183913    8.50    ACTIVE  8.16       9.25       16.99
15  2802    603497902941    7.96    ACTIVE  7.16       8.15       14.99
28  2803    603497897452    9.35    ACTIVE  9.26       10.75      18.99
43  2804    4050538324761   14.45   ACTIVE  13.76      14.75      26.99
50  2805    4050538307429   10.20   ACTIVE  9.26       10.75      18.99

当然,您可以相应地过滤数据帧

顺便说一句:有人对如何正确使用带空格的列名有什么建议吗?从剪贴板上读会把很多东西混在一起;)

你可以用^{}来做这个

但是,此方法的一个要求是,必须对左侧帧上的键进行排序。因此需要在下面的示例中使用^{}^{},然后使用^{}^{}

df_merged = (pd.merge_asof(df1.reset_index().sort_values('Net Cost'),
                           df2[['Cost (low)', 'Retail']],
                           left_on='Net Cost',
                           right_on='Cost (low)')
             .set_index('index')
             .sort_index()
             .drop('Cost (low)', axis=1))

print(df_merged)

              Cat Nr  Net Cost  Status  Retail
index                                         
2801    825646183913      8.50  ACTIVE   16.99
2802    603497902941      7.96  ACTIVE   14.99
2803    603497897452      9.35  ACTIVE   18.99
2804   4050538324761     14.45  ACTIVE   26.99
2805   4050538307429     10.20  ACTIVE   18.99

相关问题 更多 >