Python中是否有一个VLOOKUP函数,允许您根据原始表中的值从列返回值?

Python中是否有一个VLOOKUP函数,允许您根据原始表中的值从列返回值?,python,pandas,dataframe,vlookup,Python,Pandas,Dataframe,Vlookup,我已经开始学习Python,因为我对在excel中使用Python进行大量数据分析感兴趣 我从事物流工作,目前在excel中执行的一项非常常见的活动是查找运输费率,并将成本应用于交付数据 下面是一个非常简单的交付数据框架: 以下是费率的简单数据框架: 在excel中,我会添加一个卷带列,然后在关税表中查找邮政编码,并根据卷带列返回列号 我已经使用下面的代码实现了相同的结果,但我觉得可能有更好的方法来实现这些结果。如果有人有更好的方法执行此操作,我将非常感谢您的建议 对于第一步,要按照它应该是

我已经开始学习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”。

感谢所有回复。特别是建议使用查找功能。在的帮助下,我成功地使查找功能工作

我必须对我的数据做一些修改,如下所示:

  • 我将关税表的列标签更改为整数,以便它们的列标签与应用于“bands”列的值匹配
  • 加载带csv时,我将“带”列设置为字符串而不是整数
  • 这就允许我执行查找功能。之前它失败了,因为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'])
    
    再次感谢大家的帮助和支持

    问候
    迈克

    谢谢你的回复。特别是建议使用查找功能。在的帮助下,我成功地使查找功能工作

    我必须对我的数据做一些修改,如下所示:

  • 我将关税表的列标签更改为整数,以便它们的列标签与应用于“bands”列的值匹配
  • 加载带csv时,我将“带”列设置为字符串而不是整数
  • 这就允许我执行查找功能。之前它失败了,因为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'])
    
    再次感谢大家的帮助和支持

    问候
    Mike

    你能在这里复制/粘贴代码和数据,而不是通过照片共享吗?它使人们更容易自己实际运行代码:)虽然稍后我将查看您的全部代码,但我必须指出,出于多种原因,使用
    iterrows
    可能是个坏主意。幸运的是,有一个叫做
    itertuples
    的很好的替代方案,即使是在小的例子中,它也比
    iterrows
    快1000倍左右。哎呀,我忘了链接了。请查看pandas lookup Hi,感谢您的回复。我将在将来把代码添加到问题中,而不是作为一个图像。这是我第一次,我想这些图像会嵌入显示器中。我已经尝试过iTerPles,并使其正常工作,但计时与iterrows相比,速度几乎相同,因此似乎没有任何性能改进。我已经看了“查找”文档,但似乎不知道如何使其工作,不断出现错误。嗨,请尝试保持两步流程;关于第二步,请参见下面我建议的方法,使用
    .merge
    。您是否可以将代码和数据复制/粘贴到此处,而不是通过照片共享?它使人们更容易自己实际运行代码:)虽然稍后我将查看您的全部代码,但我必须指出,出于多种原因,使用
    iterrows
    可能是个坏主意。幸运的是,有一个叫做
    itertuples
    的很好的替代方案,即使是在小的例子中,它也比
    iterrows
    快1000倍左右。哎呀,我忘了链接了。请查看pandas lookup Hi,感谢您的回复。我将在将来把代码添加到问题中,而不是作为一个图像。这是我第一次,我想这些图像会嵌入显示器中。我已经试过了