2017-09-14 7 views
1

は、私がデータフレームを持って不足している列名/キーにマッチ行の値以下のようになります。Q5、Q10、Q41、アイテムはカラム名です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 

DataFrame。列 "item"の値が列名と一致する列の値を持つ列 "name"をもう1つ追加します。だから私は以下のように見えるようにします:

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) 

そして、私はエラーを取得する:私は以下のようにやってみました私もdf.apply以下のように使用してみました

KeyError: "['Q571', 'Q23340'] not in index"

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]の代わりにアプローチをするには

関連する問題