PythonKeyError:pandas:将行值与缺少某些键的列名/键匹配

PythonKeyError:pandas:将行值与缺少某些键的列名/键匹配,python,pandas,numpy,keyerror,Python,Pandas,Numpy,Keyerror,我有一个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 df['col_exist'] = [(col in df.columns) for col in df.item

我有一个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  
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)
其中,Q5、Q10、Q41项是数据帧的列名。我想再添加一列“name”,它将具有列的值,其中列“item”的值与列名称匹配。因此,我希望它看起来如下所示:

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
 df['name'] = np.where(df['col_exist']==True, df.apply(lambda x: x[x.item], axis=1), np.nan)
这里的问题是,项目多于列。因此,并非列项中的所有值都作为列存在,这会导致keyError。我试着像下面这样做:

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  
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,如下所示:

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
 df['name'] = np.where(df['col_exist']==True, df.apply(lambda x: x[x.item], axis=1), np.nan)
但我得到的错误如下:

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
 df['name'] = np.where(df['col_exist']==True, df.apply(lambda x: x[x.item], axis=1), np.nan)
KeyError:('Q571','发生在索引2')

我不知道为什么它试图访问不存在的列,尽管在那里放置了col_exit check


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

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

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

输出:

Q5 Q10 Q41 item new name 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