【问题标题】:Python KeyError: pandas: match row value to column name/key where some keys are missingPython KeyError:pandas:将行值与缺少某些键的列名/键匹配
【发布时间】:2017-09-14 14:36:01
【问题描述】:

我有如下所示的 DataFrame:

Q5 | Q10 | Q41 | item 
a  | b   | c   |  Q5  
d  | e   | f   |  Q10  
g  | h   | i   |  Q571    
j  | k   | l   |  Q23340  
m  | n   | o   |  Q41  
h  | p   | s   |  Q10  

其中 Q5、Q10、Q41、item 是 DataFrame 的列名。我想再添加一列“名称”,它将具有列“项目”的值与列名称匹配的列的值。所以我希望它如下所示:

Q5 | Q10 | Q41 | item    | name
a  | b   | c   |  Q5     |  a
d  | e   | f   |  Q10    |  e
g  | h   | i   |  Q571   |  NA
j  | k   | l   |  Q23340 |  NA
m  | n   | o   |  Q41    |  o
h  | p   | s   |  Q10    |  p

这里的问题是,项目多于列。因此,并非列 item 中的所有值都作为导致 keyError 的列存在。我尝试如下操作:

df['col_exist'] = [(col in df.columns) for col in df.item]
df['name'] = np.where(df['col_exist']==True, df[df.item], np.nan)

我得到错误:

KeyError: "['Q571', 'Q23340'] 不在索引中"

我也尝试使用 df.apply 如下:

 df['name'] = np.where(df['col_exist']==True, df.apply(lambda x: x[x.item], axis=1), np.nan)

但我收到如下错误:

KeyError: ('Q571', '发生在索引 2')

我不确定为什么它试图访问不存在的列,尽管在那里放置了 col_exit 检查。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: python pandas numpy keyerror


    【解决方案1】:

    您可以根据列过滤项目列,然后使用查找,即

    df['new'] = df['item'].apply(lambda x : x if x in df.columns else np.nan)
    

    df['new'] = np.where(df['item'].isin(df.columns), df['item'], np.nan)
    df['name'] = np.nan
    df['name'] = df.lookup(df.index,df['new'].fillna('name'))
    

    输出:

    Q5 Q10 Q41 项目新名称 0 a b c Q5 Q5 a 1 d e f Q10 Q10 e 2 g h i Q571 NaN NaN 3 j k l Q23340 NaN NaN 4 m n o Q41 Q41 o 5 h p s Q10 Q10 p

    删除新列df = df.drop('new',1)

    要使您的方法有效而不是 df[df.item] 使用 df['item']

    df['name'] = np.where(df['col_exist']==True, df['item'], np.nan)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      相关资源
      最近更新 更多