首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python中实现EXCEL的查找功能

如何在Python中实现EXCEL的查找功能
EN

Stack Overflow用户
提问于 2019-02-12 10:24:26
回答 1查看 1.4K关注 0票数 2

我一直试图找出如何在Python中实现类似于EXCEL的VLOOKUP函数的特性,以便使用公共值组合多个数据集。我想出了一个可行的办法,但我觉得这不是最好的解决办法。在下面的示例中,为了说明我的问题,我将数据集限制为三个,但实际上,我可能有许多数据集。

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np

time_a   = np.arange(0, 10010, 10)
data_a1  = np.random.randint(1500, 2500, 1001)
data_a2  = np.random.randint(750, 1500, 1001)

time_b   = np.arange(0, 10005, 5)
data_b1  = np.random.randint(0, 10, 2001)
data_b2  = np.random.randint(0, 20, 2001)
data_b3  = np.random.randint(0, 15, 2001)

time_c   = np.arange(0, 10030, 30)

df_a     = pd.DataFrame({'time_a': time_a, 'data_a1': data_a1, 'data_a2': data_a2})
df_b     = pd.DataFrame({'time_b': time_b, 'data_b1': data_b1, 'data_b2': data_b2, 'data_b3': data_b3})
df_c     = pd.DataFrame({'time_c': time_c})

df_a_c   = pd.merge_asof(df_c, df_a, left_on=['time_c'], right_on=['time_a'])
df_a_b_c = pd.merge_asof(df_a_c, df_b, left_on=['time_c'], right_on=['time_b'])

为了使这一工作有效,我需要两次使用pd.merge_asof,考虑到我得到了三个数据集(我想避免这种情况)。由于我现在有三个相同的时间(time_atime_btime_c),所以也可以方便地将其中一个重命名为time并删除另外两个:

代码语言:javascript
运行
复制
df_a_b_c.rename(columns={'time_c':'time'}, inplace=True)
df_a_b_c.drop(columns=['time_a', 'time_b'])

https://codereview.stackexchange.com/questions/124964/vlookup-in-python的启发下,我也尝试使用而没有任何运气。

代码语言:javascript
运行
复制
def vlookup(key, table, column, approximate_match=True):
    compare = key.__ge__ if approximate_match else key.__eq__
    try:
        return max(row for row in table if compare(row[0]))[column]
    except ValueError:
        return None
  • 这样做是有可能的,例如,使用“矮胖”,还是我必须绕道穿过熊猫?
  • 我必须多次使用pd.merge_asof来组合多个数据集吗?
  • 如果我只想选择某些列而不组合整个数据集,这可能吗?
  • Python中推荐的实践是什么?

我非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-12 11:54:43

np.searchsorted与设置为a-1或+1 (排序或向下)的VLOOKUP相同(实际上,与索引+匹配相同)。

代码语言:javascript
运行
复制
df_a     = pd.DataFrame({'time': time_a, 'data_a1': data_a1, 'data_a2': data_a2})
df_b     = pd.DataFrame({'time': time_b, 'data_b1': data_b1, 'data_b2': data_b2, 'data_b3': data_b3})
df_c     = pd.DataFrame({'time': time_c})

for df in [df_a, df_b]:
    for c in df.columns:
        if c == 'time':
            continue
        df_c[c] = df[c].iloc[np.clip(df['time'].searchsorted(df_c.time), 0, len(df)-1)].values
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54647865

复制
相关文章

相似问题

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