KeyError:在熊猫中尝试使用.loc方法将布尔列值更改为字符串时

Posted

技术标签:

【中文标题】KeyError:在熊猫中尝试使用.loc方法将布尔列值更改为字符串时【英文标题】:KeyError: in pandas when trying to change boolean column values into string while using .loc method 【发布时间】:2019-02-11 06:50:38 【问题描述】:

我正在运行一个条件循环,以根据“单独”列的值在我的 DataFrame (TDF) 中创建一个新列。 如果值为 0,则添加字符串“alone”,否则在“alone”列中添加“with family”。 我正在使用代码: 我收到错误消息:

tdf['alone'].loc[['alone'] >0]= 'with family'
tdf['alone'].loc[['alone'] ==0] = 'alone'

运行上述行后,我收到以下错误:

KeyError: 'cannot use a single bool to index into setitem'

我提到了这个same question,我收集到的是我需要在tdf['alone'].loc[[row_indexer,['alone']] = 'alone' 中有row_indexer,但我不确定如何获取row_indexer 中的值

【问题讨论】:

【参考方案1】:

[['alone'] > 0] 将 Python 列表 ['alone'] 与整数 0 进行比较。请改用以下内容:

tdf.loc[tdf['alone'] > 0, 'alone'] = 'with family'
tdf.loc[tdf['alone'] == 0, 'alone'] = 'alone'

【讨论】:

请不要让我改变你的解决方案:( 您好,感谢您的快速回复,当我运行您的代码时,它根据“单独”列将数据框 tdf(890X14) 的整行替换为“单独/与家人” ,而我只想更改“单独”列的值。 @jezrael 我没有“由你”更改我的解决方案。请不要编辑与我的意图相矛盾的答案。我犯了一个错误并更正了它,您恰好也回答正确。 @AndreyPortnoy - 很抱歉,无法验证。也许我错了:(【参考方案2】:

pandas.Series.clip

将值剪辑为仅 01 并使用它对数组进行切片

tdf.assign(alone=np.array(['alone', 'with family'])[tdf.alone.clip(0, 1)])

         alone  col
0  with family    1
1  with family    1
2  with family    9
3        alone    4
4  with family    2
5        alone    3

pandas.Series.map

tdf.assign(alone=tdf.alone.map(lambda x: 'with family' if x else 'alone'))

         alone  col
0  with family    1
1  with family    1
2  with family    9
3        alone    4
4  with family    2
5        alone    3

map

第 2 版

tdf.assign(alone=tdf.alone.map(lambda x: 0: 'alone'.get(x, 'with family')))

         alone  col
0  with family    1
1  with family    1
2  with family    9
3        alone    4
4  with family    2
5        alone    3

设置

借自@jezrael

tdf = pd.DataFrame('alone':[4,4,5,0,5,0],
                   'col':[1,1,9,4,2,3])

【讨论】:

【参考方案3】:

需要带有loc 和布尔掩码的boolean indexing - 将DataFrame 的列与值0 进行比较,而不是一个项目列表[alone]

tdf.loc[tdf['alone'] > 0, 'alone'] = 'with family'
tdf.loc[tdf['alone'] ==0, 'alone'] = 'alone'

如果不是负数可以使用numpy.where:

tdf['alone'] = np.where(tdf['alone'] == 0,  'alone', 'with family')

示例

tdf = pd.DataFrame('alone':[4,4,5,0,5,0],
                   'col':[1,1,9,4,2,3])

print (tdf)
   alone  col
0      4    1
1      4    1
2      5    9
3      0    4
4      5    2
5      0    3

tdf['alone'] = np.where(tdf['alone'] == 0,  'alone', 'with family')
print (tdf)

         alone  col
0  with family    1
1  with family    1
2  with family    9
3        alone    4
4  with family    2
5        alone    3

解决方案也是错误的,因为chained assignments - 它可以创建一个副本来更新您看不到的tdf['alone'] 的副本:

#added boolean mask tdf['alone'] > 0
tdf['alone'].loc[tdf['alone'] > 0 ]= 'with family'

【讨论】:

嘿,感谢您的快速回复,您建议的方法完美无缺,但我很好奇我该怎么做?您对此有什么意见或建议? @Sajal - 然后使用 tdf.loc[tdf['alone'] > 0, 'alone'] = 'with family'tdf.loc[tdf['alone'] ==0, 'alone'] = 'alone'

以上是关于KeyError:在熊猫中尝试使用.loc方法将布尔列值更改为字符串时的主要内容,如果未能解决你的问题,请参考以下文章

KeyError:尝试使用熊猫构建箱线图时项目不在索引中

使用 .loc[] 提取行时出现 keyerror

Pandas:尝试从 Excel 文件中的 df.loc 打印值时出现 KeyError

使用 .loc() 时的 Pandas KeyError [重复]

使用日期时间绘制切片熊猫数据框时出现 KeyError

使用熊猫数据框时出现 KeyError