替代 df.lookup(row, col)

问题描述 投票:0回答:1

我在

.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)

在我看来,这非常方便且易于理解。 熊猫告诉我:

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()

python pandas dataframe search
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 秒)

© www.soinside.com 2019 - 2024. All rights reserved.