python - Pandas Python 中的 SUMIFS 公式

标签 python pandas data-analysis

我在一家物流公司工作,我们为客户提供 B2C 送货服务。因此,我们有一张表格形式的价目表和送货/交易 list 、包裹重量和送货地点。

我看到这里回答了很多 SUMIFS 问题,但与我需要的问题有很大不同。

第一个transaction dataframe包含transaction id, weight, island, category

transaction   weight   island   category
1             0.3      luzon    regular
2             0.5      visayas  express
3             0.5      luzon    express
4             0.4      visayas  regular
5             1.7      visayas  regular
6             1.5      luzon    regular

第二个rate card dataframe包含categorymin_weightmax_weightfee

category    island  min weight  max weight  fee
regular     luzon     0            0.5       30
regular     luzon     0.51         3.0       40
express     luzon     0            3.0       45
regular     visayas   0            0.5       50
regular     visayas   0.51         3.0       60
express     visayas   0            3.0       65

所以我想根据包裹的重量和位置来计算费用。生成的 transaction dataframe 应该是

transaction      weight      island    category       fee
1                 0.3        luzon      regular        30
2                 0.5       visayas     express        65
3                 0.5        luzon      express        45
4                 0.4       visayas     regular        50
5                 1.7       visayas     regular        60
6                 1.5        luzon      regular        40

下面是 EXCEL 中关于如何计算 fees 的公式

=SUMIFS(rate_card.fee, rate_card.min_weight <= transaction.weight, rate_card.max_weight >= transaction.weight, rate_card.island = transaction.island, rate_card.category = transaction.category)

所以我想使用 PandasPython 中复制这个特定的公式

希望有人能为我 1 个月的问题提供解决方案。

最佳答案

这是 merge categoryisland然后 query weight来自 transaction数据框介于 min weight 之间和 max weight :

new = transaction.merge(rate_card, on=['category', 'island'])\
                 .query('weight.between(`min weight`, `max weight`)')\
                 .sort_values('transaction')\
                 .drop(['min weight', 'max weight'], axis=1)

或者如果您的 pandas < 0.25.0 , 不支持 query 中的反引号列选择然而,然后使用:

new = transaction.merge(rate_card, on=['category', 'island'])

new = new.loc[new['weight'].between(new['min weight'], new['max weight'])]\
         .sort_values('transaction')\
         .drop(['min weight', 'max weight'], axis=1)

输出

   transaction  weight   island category  fee
0            1     0.3    luzon  regular   30
4            2     0.5  visayas  express   65
5            3     0.5    luzon  express   45
6            4     0.4  visayas  regular   50
9            5     1.7  visayas  regular   60
3            6     1.5    luzon  regular   40

详细信息: 第一次合并给了我们:

transaction.merge(rate_card, on=['category', 'island'])

   transaction  weight   island category  min weight  max weight  fee
0            1     0.3    luzon  regular        0.00         0.5   30
1            1     0.3    luzon  regular        0.51         3.0   40
2            6     1.5    luzon  regular        0.00         0.5   30
3            6     1.5    luzon  regular        0.51         3.0   40
4            2     0.5  visayas  express        0.00         3.0   65
5            3     0.5    luzon  express        0.00         3.0   45
6            4     0.4  visayas  regular        0.00         0.5   50
7            4     0.4  visayas  regular        0.51         3.0   60
8            5     1.7  visayas  regular        0.00         0.5   50
9            5     1.7  visayas  regular        0.51         3.0   60

然后我们过滤所有weight = between min weight, max weight所在的行:

new = transaction.merge(rate_card, on=['category', 'island'])\
                 .query('weight.between(`min weight`, `max weight`)')

   transaction  weight   island category  min weight  max weight  fee
0            1     0.3    luzon  regular        0.00         0.5   30
3            6     1.5    luzon  regular        0.51         3.0   40
4            2     0.5  visayas  express        0.00         3.0   65
5            3     0.5    luzon  express        0.00         3.0   45
6            4     0.4  visayas  regular        0.00         0.5   50
9            5     1.7  visayas  regular        0.51         3.0   60

最后两步是正确排序和删除不需要的列

关于python - Pandas Python 中的 SUMIFS 公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58471669/

相关文章:

python - 十进制数的二进制邻居

python - 解析所有可能的 YouTube 网址

python - 使用列表来比较不等长度的字符串

python - Pandas Groupby 计算 ewm 未按预期工作

python - Pandas :删除重复但连续的行并将第一行保留在组中

data-analysis - 使用机器学习算法对 python 中的推文进行情感分析

python - 如何合并两个数据框并对列的值求和

python - graphlab create sframe 如何获取 SArray 中位数

python - Django 导入日期时间

Python:如何将不同数据帧中具有相同名称的列彼此相邻放置?