python - 如何根据包含列名的字段从列中获取值?
问题描述
我的数据框有一个多索引。C1 到 C7 最多有 7 列,但我在这里只显示了 C1 和 C2。在列 Correct_Category 下,它包含要从中获取值的列的名称,并且还包含 NaN
index1 index2 C1 C2 Correct_Category Matched
m1 a 10 0 C1 True
b 20 5 C2 True
c 10 10 C1 True
m2 d 1 15 C2 True
e 18 10 NaN False
我的目标是添加一个“匹配”列,它根据 Correct_Category 中的列名给出值。
index1 index2 C1 C2 Correct_Category Matched Number
m1 a 10 0 C1 True 10
b 20 5 C2 True 5
c 10 10 C1 True 10
m2 d 1 15 C2 True 15
e 18 10 NaN False 0
到目前为止,我尝试过的所有操作,使用 .loc、.where、.apply、.query 都返回了不同的错误。
我当前的代码行:
df['Number']= df['Matched'].apply(lambda x: df[df['Correct_Category'] if x==True else 'No Category')
df[df['Correct_Category'] 是我想插入可以找到正确值的代码的地方,但这是不断返回不同错误的关键部分。
当前错误是“ValueError:无法使用包含 NA/NaN 值的向量进行索引”
解决方案
DataFrame.lookup
仅用于过滤的行:
mask = df['Correct_Category'].isin(df.columns)
#alternative 1
#mask = df['Correct_Category'].notna()
#alternative 2
#mask = df['Matched']
df.loc[mask, 'Number'] = df.loc[mask].lookup(df.index[mask], df.loc[mask, 'Correct_Category'])
print (df)
C1 C2 Correct_Category Matched Number
index1 index2
m1 a 10 0 C1 True 10.0
b 20 5 C2 True 5.0
c 10 10 C1 True 10.0
m2 d 1 15 C2 True 15.0
e 18 10 NaN False NaN