Python KeyError: pandas: match row value to column name/key where some keys are missing
Python KeyError: pandas: match row value to column name/key where some keys are missing
我有如下所示的 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 的列名。我想再添加一列 "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 检查。
有人可以帮我解决这个问题吗?
您可以根据列筛选项目列,然后使用查找,即
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)
我有如下所示的 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 的列名。我想再添加一列 "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 检查。
有人可以帮我解决这个问题吗?
您可以根据列筛选项目列,然后使用查找,即
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)