正如MorningGlory在评论中所述,lookup
已在版本1.2.0
中被弃用。
文档说明可以使用melt
和loc
实现相同的功能,但我认为这并不是很明显,因此在这里介绍一下。
首先,使用melt
创建一个查找DataFrame
:
i = pd.Series(["a", "a", "b", "c", "b"], name="col")
melted = pd.melt(
pd.concat([i, df], axis=1),
id_vars="col",
value_vars=df.columns,
ignore_index=False,
)
col variable value
0 a a 1
1 a a 4
2 b a 7
3 c a 10
4 b a 13
0 a b 2
1 a b 5
2 b b 8
3 c b 11
4 b b 14
0 a c 3
1 a c 6
2 b c 9
3 c c 12
4 b c 15
然后,使用
loc
仅获取相关值:
result = melted.loc[melted["col"] == melted["variable"], "value"]
0 1
1 4
2 8
4 14
3 12
Name: value, dtype: int64
最后,如果需要,可以按照之前的索引顺序获取相同的索引顺序:
result.loc[df.index]
0 1
1 4
2 8
3 12
4 14
Name: value, dtype: int64
Pandas在文档中使用`factorize`和`numpy`索引提供了不同的解决方案:
文档链接。
df = pd.concat([i, df], axis=1)
idx, cols = pd.factorize(df['col'])
df.reindex(cols, axis=1).to_numpy()[np.arange(len(df)), idx]
[ 1 4 8 12 14]
df.unstack().loc[zip(i.values,i.index)] = [1,2,3,4,5]
。并且你必须在两侧匹配长度(你也可以使用此语法进行选择);请参见此问题:https://github.com/pydata/pandas/issues/7138 - Jeffpd.Series(df.lookup(i.index, i.values), index=i.index)
。 - user394430