2017-09-14 70 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) 
相關問題