很抱歉,以前是否曾问过这个问题,这似乎很琐碎,但是我却找不到答案。
假设我有一列(selected
),其中包含另一列(option_1
,option_2
,option_3
,option_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之外别无其他方法,特别是考虑到idxmin
和idxmax
之类的方法恰好返回了其中的列格式。
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)
答案 0 :(得分:4)
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