2017-09-14 75 views
1

我有数据帧它看起来像下面:的Python 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 

其中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 

这里的问题是,有更多的项目比列。因此,并非列项中的所有值都以引起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'] not in index"

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

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

但我下面得到错误:

KeyError: ('Q571', 'occurred at index 2')

我不知道为什么它我试图访问不存在的列,尽管将col_exit检查放在那里。

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

回答

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

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

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

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