【发布时间】:2019-07-05 23:15:19
【问题描述】:
我一直试图弄清楚如何在 Python 中实现类似于 EXCEL 的VLOOKUP 函数的功能,以便使用一个共同的值组合多个数据集。我想出了一个确实有效的方法,但我觉得这不是最好的解决方案。在下面的示例中,为了说明我的问题,我将数据集限制为三个,但实际上,我可能有很多数据集
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_a、time_b 和 time_c),也许将其中一个重命名为 time 并删除另外两个也很方便:
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的启发,我也尝试使用,没有任何运气
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
- 可以使用例如 numpy 来执行此操作,还是我必须绕过 pandas?
- 是否必须多次使用
pd.merge_asof才能合并多个数据集? - 如果我只想选择某些列而不合并整个数据集,这可能吗?
- 在 Python 中推荐的做法是什么?
我非常感谢任何帮助。
【问题讨论】:
标签: python excel python-3.x pandas numpy