Python 是否有一种矢量化的方式来访问另一列中明确指示的列的值?

Python 是否有一种矢量化的方式来访问另一列中明确指示的列的值?,python,pandas,Python,Pandas,我很抱歉,如果以前有人问过这个问题,这似乎很琐碎,但不知为什么我找不到答案 假设我有一个列(选中的),其中包含另一列的名称(选项1,选项2,选项3,选项4): 因此,例如,对于第一行(id==0),所选列指示值存储在选项_4(即110.0)中,对于第二行,它存储在选项_2,等等 是否有一种矢量化方法(例如,不使用apply)可以获得一个新的系列(列),其中仅包含所选列中指示的值? 这似乎是一种常见的情况,我发现很难相信除了使用apply之外没有其他方法,特别是考虑到像and这样的方法正好以这种格

我很抱歉,如果以前有人问过这个问题,这似乎很琐碎,但不知为什么我找不到答案

假设我有一个列(
选中的
),其中包含另一列的名称(
选项1
选项2
选项3
选项4
):

因此,例如,对于第一行(
id==0
),所选
列指示值存储在
选项_4
(即110.0)中,对于第二行,它存储在
选项_2
,等等

是否有一种矢量化方法(例如,不使用apply)可以获得一个新的系列(列),其中仅包含所选
列中指示的值?

这似乎是一种常见的情况,我发现很难相信除了使用apply之外没有其他方法,特别是考虑到像and这样的方法正好以这种格式返回列


如何使用apply实现结果的示例 使用:

使用:


@jesrael,我用了你的答案,注意到我的代码更慢了。经过一些测试后,我发现
min
lookup
更快(请参见a)。你知道我会错过什么吗?@toto_tico问得很难,我不是熊猫开发者。也许问题熊猫更适合于少数列和大量od行。@jesrael,我用了你的答案,注意到我的代码更慢。经过一些测试后,我发现
min
lookup
更快(请参见a)。你知道我会错过什么吗?@toto_tico问得很难,我不是熊猫开发者。对于少数列和大量od行,问题熊猫可能更为优化。
    id  option_1    option_2    option_3    option_4    selected
0   0   10.0        NaN         NaN         110.0       option_4
1   1   NaN         20.0        200.0       NaN         option_2
2   2   NaN         300.0       30.0        NaN         option_3
3   3   400.0       NaN         NaN         40.0        option_1
4   4   600.0       700.0       50.0        50.0        option_3
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id': [0,1,2,3,4], 
    'option_1': [10,     np.nan, np.nan, 400,    600], 
    'option_2': [np.nan, 20,     300,    np.nan, 700], 
    'option_3': [np.nan, 200,    30,     np.nan, 50],
    'option_4': [110,    np.nan, np.nan, 40,     50], 
    'selected': ['option_4','option_2','option_3','option_1','option_3']
})
df['value'] = df.apply(lambda x: x[x['selected']], axis=1)
df['value'] = df.lookup(df.index, df['selected'])
print (df)
   id  option_1  option_2  option_3  option_4  selected  value
0   0      10.0       NaN       NaN     110.0  option_4  110.0
1   1       NaN      20.0     200.0       NaN  option_2   20.0
2   2       NaN     300.0      30.0       NaN  option_3   30.0
3   3     400.0       NaN       NaN      40.0  option_1  400.0
4   4     600.0     700.0      50.0      50.0  option_3   50.0