我已经开始学习 Python,因为我有兴趣将它用于我目前在 excel 中进行的大量数据分析。
我从事物流工作,目前我在 Excel 中执行的一项非常常见的事件是查找运输费率并将成本应用于交付数据。
下面是一个非常简单的交付 DataFrame:
下面是一个简单的关税 DataFrame:
在 excel 中,我会添加一个 volume band 列,然后在关税表中查找邮政编码并返回基于 volume band 列的列号。
我已经设法使用下面的代码实现了相同的结果,但我觉得好像可能有更好的方法来实现这些结果。如果有人有更好的方法来执行此操作,我将非常感谢您提供一些建议。
最佳答案
感谢大家的回复。特别是使用查找功能的建议。在Python Pandas: Hlookup Function?的帮助下我设法使查找功能正常工作。
我必须对我的数据进行如下修改:
- 我将关税表的列标签更改为整数,以便它们的列标签与应用于“bands”列的值相匹配。
- 加载 bands csv 时,我将“Band”列设置为字符串而不是整数。
这让我可以执行查找功能。之前由于数据类型不匹配导致 Python 无法匹配而失败。
我现在已经使用这一行简单的代码执行了查找,它的运行速度似乎比 iterrows 和 itertuples 函数快 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'])
再次感谢大家的帮助和支持。
问候 迈克
关于python - Python 中是否有 VLOOKUP 函数允许您根据原始表中的值从列中返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58774232/