Python中是否有一个VLOOKUP函数,允许您根据原始表中的值从列返回值?
我已经开始学习Python,因为我对在excel中使用Python进行大量数据分析感兴趣 我从事物流工作,目前在excel中执行的一项非常常见的活动是查找运输费率,并将成本应用于交付数据 下面是一个非常简单的交付数据框架: 以下是费率的简单数据框架: 在excel中,我会添加一个卷带列,然后在关税表中查找邮政编码,并根据卷带列返回列号 我已经使用下面的代码实现了相同的结果,但我觉得可能有更好的方法来实现这些结果。如果有人有更好的方法执行此操作,我将非常感谢您的建议Python中是否有一个VLOOKUP函数,允许您根据原始表中的值从列返回值?,python,pandas,dataframe,vlookup,Python,Pandas,Dataframe,Vlookup,我已经开始学习Python,因为我对在excel中使用Python进行大量数据分析感兴趣 我从事物流工作,目前在excel中执行的一项非常常见的活动是查找运输费率,并将成本应用于交付数据 下面是一个非常简单的交付数据框架: 以下是费率的简单数据框架: 在excel中,我会添加一个卷带列,然后在关税表中查找邮政编码,并根据卷带列返回列号 我已经使用下面的代码实现了相同的结果,但我觉得可能有更好的方法来实现这些结果。如果有人有更好的方法执行此操作,我将非常感谢您的建议 对于第一步,要按照它应该是
对于第一步,要按照它应该是哪个波段对每一行进行分类,您似乎已经在用
pd.merge\u asof
做“正确的事情”。我没有更好的主意:-)
第二步——要获得每个波段的费率,您应该考虑使用df.merge
或df.join
——每次执行vlookup时,您基本上是基于一个键将两个表合并
因此,在您的情况下,执行类似于
df_merged=data_banded.merge(关税,左上=['Zip','Band'],右上=['Zip','Band'],how='left')
——这假设您的关税表具有特定于邮政编码的值。如果只是按波段,请从列表中删除'Zip'。第一步,要按波段对每一行进行分类,您似乎已经在用pd.merge\u asof
做“正确的事情”。我没有更好的主意:-)
第二步——要获得每个波段的费率,您应该考虑使用df.merge
或df.join
——每次执行vlookup时,您基本上是基于一个键将两个表合并
因此,在您的情况下,执行类似于
df_merged=data_banded.merge(关税,左上=['Zip','Band'],右上=['Zip','Band'],how='left')
——这假设您的关税表具有特定于邮政编码的值。如果只是按波段排列,请从列表中删除“Zip”。感谢所有回复。特别是建议使用查找功能。在的帮助下,我成功地使查找功能工作
我必须对我的数据做一些修改,如下所示:
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'])
再次感谢大家的帮助和支持
问候
迈克谢谢你的回复。特别是建议使用查找功能。在的帮助下,我成功地使查找功能工作 我必须对我的数据做一些修改,如下所示:
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'])
再次感谢大家的帮助和支持
问候
Mike你能在这里复制/粘贴代码和数据,而不是通过照片共享吗?它使人们更容易自己实际运行代码:)虽然稍后我将查看您的全部代码,但我必须指出,出于多种原因,使用
iterrows
可能是个坏主意。幸运的是,有一个叫做itertuples
的很好的替代方案,即使是在小的例子中,它也比iterrows
快1000倍左右。哎呀,我忘了链接了。请查看pandas lookup Hi,感谢您的回复。我将在将来把代码添加到问题中,而不是作为一个图像。这是我第一次,我想这些图像会嵌入显示器中。我已经尝试过iTerPles,并使其正常工作,但计时与iterrows相比,速度几乎相同,因此似乎没有任何性能改进。我已经看了“查找”文档,但似乎不知道如何使其工作,不断出现错误。嗨,请尝试保持两步流程;关于第二步,请参见下面我建议的方法,使用.merge
。您是否可以将代码和数据复制/粘贴到此处,而不是通过照片共享?它使人们更容易自己实际运行代码:)虽然稍后我将查看您的全部代码,但我必须指出,出于多种原因,使用iterrows
可能是个坏主意。幸运的是,有一个叫做itertuples
的很好的替代方案,即使是在小的例子中,它也比iterrows
快1000倍左右。哎呀,我忘了链接了。请查看pandas lookup Hi,感谢您的回复。我将在将来把代码添加到问题中,而不是作为一个图像。这是我第一次,我想这些图像会嵌入显示器中。我已经试过了