首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中是否有一个VLOOKUP函数,允许您根据原始表中的值从列返回值?

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

Stack Overflow用户
提问于 2019-11-08 21:53:26
回答 2查看 1.3K关注 0票数 2

我已经开始学习Python,因为我对使用它进行大量数据分析感兴趣,而我目前在excel中这样做。

我在物流部门工作,我目前在excel中执行的一项非常常见的工作是查找运输费用并将成本应用于交付数据。

下面是一个非常简单的交付DataFrame:

送货DataFrame

以下是关税的简单DataFrame:

关税DataFrame

在excel中,我会添加一个卷带列,然后在关税表中查找邮政编码,然后根据卷带列返回列号。

使用下面的代码,我成功地实现了相同的结果,但我觉得可能有更好的方法来实现这些结果。如果有人有更好的方式执行这一行动,我将非常感谢一些建议。

我的密码

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-09 00:39:01

谢谢你的回复。特别是使用查找函数的建议。在Python Pandas: Hlookup函数?的帮助下,我设法使查找函数正常工作。

我不得不对我的数据做以下几处修改:

  1. 我将关税表的列标签更改为整数,以便它们的列标签与应用于“bands”列的值相匹配。
  2. 在加载波段csv时,我已经将'Band‘列设置为字符串而不是整数。

这样我就可以执行查找功能了。在它失败之前,由于数据类型的不匹配,Python无法匹配。

现在我已经使用这一行简单的代码执行了查找,它的运行速度似乎比迭代行和迭代函数快3到4倍:

代码语言:javascript
复制
data_banded['Cost'] = tariff_V2.set_index('Zip').lookup(data_banded.Zip, data_banded.Band)

下面是实现此功能的完整代码详细信息:

代码语言:javascript
复制
# 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'])

再次感谢大家的帮助和支持。

问候迈克

票数 0
EN

Stack Overflow用户

发布于 2019-11-08 22:14:28

对于第一步,要对每一行进行分类,您似乎已经对pd.merge_asof进行了“正确的处理”。我没有更好的主意:-)

第二步--为了获得每个波段的关税,你应该考虑使用df.mergedf.join 指南/merging.html --每次你做vlookup时,基本上都是基于一个键连接两个表。

所以在你的例子中,做一些类似df_merged = data_banded.merge(tariffs, left_on=['Zip', 'Band'], right_on=['Zip', 'Band'], how='left')的事情--这假设你的关税表有特定于拉链的值。如果只是by,从列表中删除'Zip‘。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58774232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档