是否存在一种矢量化的方法来访问在另一列中明确指示的列的值?

时间:2018-08-20 12:49:23

标签: python pandas

很抱歉,以前是否曾问过这个问题,这似乎很琐碎,但是我却找不到答案。

假设我有一列(selected),其中包含另一列(option_1option_2option_3option_4)的名称:

    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

例如,对于第一行(id==0),selected列指示该值存储在option_4中(即110.0),对于第二行,它是存储在option_2中,等等。

是否存在一种矢量化方式(例如,不使用apply),我可以使用selected列中指示的值来获得一个新系列(列)?

这似乎是一个很常见的情况,我很难相信除了使用apply之外别无其他方法,特别是考虑到idxminidxmax之类的方法恰好返回了其中的列格式。


如何使用apply获得结果的示例

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)

1 个答案:

答案 0 :(得分:4)

使用DataFrame.lookup

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