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

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

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

df1.jpg

111.jpg

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

阅读 3.2k
2 个回答
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)

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

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

如何实现?

感谢。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题