如果用python的pandas根据目的地计算单价和挂号费并为新列赋值

发布于 2022-09-12 02:45:45 字数 297 浏览 25 评论 0

如果用python的pandas根据目的地计算单价和挂号费并为新列赋值

*1.[包裹运费]等于 [目的地]的[单价/公斤][重量]+[目的地]的[挂号费/件]
2.注意:[单价]和[挂号费] 都有部分重量段重复, 用pd.cut好像不行**

df1.jpg

111.jpg

如何能根据实际重量和区域计算运费?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

安穩 2022-09-19 02:45:45
df1 = pd.read_excel('xx.xlsx', header=[0,1], index_col=0)

image.png

  • 查到对应单价和挂号费的思路

1 筛选出重量段,这里筛选出的最后一条数据就是对应的重量段了

>>> df1[df1.index <= 0.49]

2 筛选出目的地

>>> df1[df1.index <= 0.49]['北京']

3 提取最后一条数据,此时得到的两个数据便是对应的单价和挂号费

>>> df1[df1.index <= 0.49]['北京'].iloc[-1, :].values
array([18,  8], dtype=int64)
  • df2
df2 = pd.read_excel('xx2.xlsx')

image.png

  • 将查找单价和挂号费的思路写成函数后代入 df2
def reckon(x):
    v1, v2 = df1[df1.index <= x['重量']][x['目的地']].iloc[-1,:].values
    return x['重量'] * v1 + v2
    
df2['运费'] = df2.apply(reckon, axis=1)

image.png

完整代码

df1 = pd.read_excel('xx.xlsx', header=[0,1], index_col=0)
df2 = pd.read_excel('xx2.xlsx')

def reckon(x):
    v1, v2 = df1[df1.index <= x['重量']][x['目的地']].iloc[-1,:].values
    return x['重量'] * v1 + v2
    
df2['运费'] = df2.apply(reckon, axis=1)

image.png

  • 将所有快递公司的参照表存入一个字典中,然后在 reckon 函数中增加一个筛选条件即可。

df2 格式为
image.png

修改后代码

tables ={        
    '中通': pd.read_excel('中通.xlsx', header=[0,1], index_col=0),
    '圆通': pd.read_excel('圆通.xlsx', header=[0,1], index_col=0),
    '韵达': pd.read_excel('韵达.xlsx', header=[0,1], index_col=0),
    '顺丰': pd.read_excel('顺丰.xlsx', header=[0,1], index_col=0)
} 
df2 = pd.read_excel('df2.xlsx')


def reckon(x):
    df = tables[x['邮寄方式']]
    v1, v2 = df[df.index <= x['重量']][x['目的地']].iloc[-1,:].values
    return x['重量'] * v1 + v2
    
df2['运费'] =  df2.apply(reckon, axis=1)

将折扣放入字典,在函数中增加一行获取折扣的代码

discount = {
    '圆通': 0.95,
    '中通': 0.8
}

def reckon(x):
    df = tables[x['邮寄方式']]
    v1, v2 = df[df.index <= x['重量']][x['目的地']].iloc[-1,:].values
    dis = discount.get(x['邮寄方式'], 1) # 获取折扣如果没有则返回 1
    return (x['重量'] * v1 + v2) * dis
    
df2['运费'] =  df2.apply(reckon, axis=1)
作妖 2022-09-19 02:45:45

感谢大神!以上问题已经解决.

又遇到的新的问题,
运费方式中,
圆通的按全部运费的0.95折收费
中通按按全部运费的0.8折收费

如何实现?

感谢。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文