我在一家物流公司工作,我们为客户做 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
包含 category
, min_weight
, max_weight
, fee
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)
所以我想使用
Python
在 Pandas
中复制这个特定的公式希望有人可以为我 1 个月的问题提供解决方案。
最佳答案
这是 merge
上的 category
和 island
,然后是 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/