df.lookup(row, col)的替代方案

3

我正在使用方法.lookup()在两个不同的数据框中,用法为df2.lookup(df1.index, df1.column)(即与Pandas-使用其他列值作为列名选择列不同)。

考虑以下MWE:

# Parameter
lo = -5
hi = 5 
n = 4
idx = range(n)
rep = 2

# DF 1
idx_1 = np.tile(idx, rep) 
data_1 =  np.random.randint(lo, hi, n*rep)
df_1 = pd.DataFrame(data_1, index=idx_1, columns=['column']) 

# DF 2
idx_2 = idx
col_2 = range(lo, hi+1)
data_2 = np.random.rand(n, len(col_2))
df_2 = pd.DataFrame(data_2, index=idx_2, columns=col_2) 

# Result
result = df_2.lookup(df_1.index, df_1.column)

在我看来,这非常方便易懂。Pandas告诉我:

FutureWarning: The 'lookup' method is deprecated and will beremoved in a future version.You can use DataFrame.melt and DataFrame.locas a substitute.

很遗憾,我不知道替代方法的工作原理。
一种直观但效率较低的解决方案是:
result = [df_2.loc[df_1.index[i], df_1.iloc[i, 0]] for i in range(n*rep)]

是否有一种易于实现的替代方法,通过内置函数替换上述任务中的df.lookup()


快速查看文档应该可以解决这个问题: https://pandas.pydata.org/docs/user_guide/indexing.html#indexing-lookup - VicN
1
我确实看了这段代码片段,但是对于我的问题,我无法应用提供的解决方案。 - clueless
同意,文档提供的解决方案似乎只适用于您想要查找所有行和每行不同的列的情况。这只匹配了查找函数实用性的一半。 - Danny
这个回答解决了你的问题吗?Pandas Lookup将被弃用 - 优雅高效的替代方案 - Danny
1个回答

0
以下代码似乎与df.lookup的速度大致相同(稍微更快):
df_2.to_numpy()[df_2.index.get_indexer(df_1.index), df_2.columns.get_indexer(df_1.column)

或者用更符合旧的 df.lookup API 的代码来表达:

df.to_numpy()[df.index.get_indexer(row_labels), df.columns.get_indexer(col_labels)]

我在一个非常小的和一个中等大小的(100k x 4) DataFrame上分别测试了旧的查找函数和这种新方法各100k次,在两种情况下,这种替代方法都比较快(39秒比41.5秒)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接