我已经开始学习Python,因为我对使用它进行大量数据分析感兴趣,而我目前在excel中这样做。
我在物流部门工作,我目前在excel中执行的一项非常常见的工作是查找运输费用并将成本应用于交付数据。
下面是一个非常简单的交付DataFrame:
以下是关税的简单DataFrame:
在excel中,我会添加一个卷带列,然后在关税表中查找邮政编码,然后根据卷带列返回列号。
使用下面的代码,我成功地实现了相同的结果,但我觉得可能有更好的方法来实现这些结果。如果有人有更好的方式执行这一行动,我将非常感谢一些建议。
发布于 2019-11-09 00:39:01
谢谢你的回复。特别是使用查找函数的建议。在Python Pandas: Hlookup函数?的帮助下,我设法使查找函数正常工作。
我不得不对我的数据做以下几处修改:
这样我就可以执行查找功能了。在它失败之前,由于数据类型的不匹配,Python无法匹配。
现在我已经使用这一行简单的代码执行了查找,它的运行速度似乎比迭代行和迭代函数快3到4倍:
data_banded['Cost'] = tariff_V2.set_index('Zip').lookup(data_banded.Zip, data_banded.Band)下面是实现此功能的完整代码详细信息:
# Create sample DataFrames (data = delivery information, bands = lookup volume band, tariff = lookup cost by band):
data = pd.DataFrame(columns = ['Customer', 'Zip', 'Volume'],
data = [['A', 'RG', 0.7], ['B', 'KT', 1.3], ['C', 'NN', 1.8], ['D', 'PO', 2.4]])
bands = pd.DataFrame(columns = ['Volume', 'Band'],
data = [[0.5, '1'], [1, '2'], [1.5, '3'], [2, '4'], [2.5, '5']])
tariff = pd.DataFrame(columns = ['Zip', '1', '2', '3', '4', '5'],
data = [['RG', 10, 20, 30, 40, 50], ['KT', 12, 24, 36, 48, 60],
['NN', 14, 28, 42, 56, 70], ['PO', 16, 32, 48, 64, 80]])
# Create DataFrame that has delivery data and the respective volume band each line falls into:
data_banded = pd.merge_asof(data, bands, on = 'Volume', direction = 'forward')
# Lookup the cost from the tariff table and apply to a new column called 'Cost' in the delivery data:
data_banded['Cost'] = tariff.set_index('Zip').lookup(data_banded['Zip'], data_banded['Band'])再次感谢大家的帮助和支持。
问候迈克
发布于 2019-11-08 22:14:28
对于第一步,要对每一行进行分类,您似乎已经对pd.merge_asof进行了“正确的处理”。我没有更好的主意:-)
第二步--为了获得每个波段的关税,你应该考虑使用df.merge或df.join 指南/merging.html --每次你做vlookup时,基本上都是基于一个键连接两个表。
所以在你的例子中,做一些类似df_merged = data_banded.merge(tariffs, left_on=['Zip', 'Band'], right_on=['Zip', 'Band'], how='left')的事情--这假设你的关税表有特定于拉链的值。如果只是by,从列表中删除'Zip‘。
https://stackoverflow.com/questions/58774232
复制相似问题