如何根据包含列名的字段从列中获取值?

时间:2019-06-17 03:50:05

标签: python pandas

我的数据框有一个多重索引,最多有7列C1至C7,但这里只显示了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值的向量进行索引”

1 个答案:

答案 0 :(得分:0)

使用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