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
将值剪辑为仅 0
和 1
并使用它对数组进行切片
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方法将布尔列值更改为字符串时的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:尝试从 Excel 文件中的 df.loc 打印值时出现 KeyError