首页 > 解决方案 > 如何根据包含列名的字段从列中获取值?

问题描述

我的数据框有一个多索引。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 值的向量进行索引”

标签: pythonpandas

解决方案


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

推荐阅读