如果用python的pandas根据目的地计算单价和挂号费并为新列赋值
如果用python的pandas根据目的地计算单价和挂号费并为新列赋值
*1.[包裹运费]等于 [目的地]的[单价/公斤][重量]+[目的地]的[挂号费/件]
2.注意:[单价]和[挂号费] 都有部分重量段重复, 用pd.cut好像不行**
如何能根据实际重量和区域计算运费?
回答:
df1 = pd.read_excel('xx.xlsx', header=[0,1], index_col=0)
- 查到对应单价和挂号费的思路
1 筛选出重量段,这里筛选出的最后一条数据就是对应的重量段了
>>> df1[df1.index <= 0.49]
2 筛选出目的地
>>> df1[df1.index <= 0.49]['北京']
3 提取最后一条数据,此时得到的两个数据便是对应的单价和挂号费
>>> df1[df1.index <= 0.49]['北京'].iloc[-1, :].valuesarray([18, 8], dtype=int64)
- df2
df2 = pd.read_excel('xx2.xlsx')
- 将查找单价和挂号费的思路写成函数后代入 df2
def reckon(x): v1, v2 = df1[df1.index <= x['重量']][x['目的地']].iloc[-1,:].values
return x['重量'] * v1 + v2
df2['运费'] = df2.apply(reckon, axis=1)
完整代码
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)
- 将所有快递公司的参照表存入一个字典中,然后在 reckon 函数中增加一个筛选条件即可。
df2 格式为
修改后代码
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)
回答:
感谢大神!以上问题已经解决.
又遇到的新的问题,
运费方式中,
圆通的按全部运费的0.95折收费
中通按按全部运费的0.8折收费
如何实现?
感谢。
以上是 如果用python的pandas根据目的地计算单价和挂号费并为新列赋值 的全部内容, 来源链接: utcz.com/p/937834.html