使用Python Pandas修改UCI成人数据集'etiquette'列值失败求助
问题:如何修改UCI成人数据集'etiquette'列的取值?
我正在处理UCI成人数据集,已添加表头方便操作。需要修改名为'etiquette'的最后一列,该列仅包含'<=50K'和'>50K'两个取值。尝试了以下两种方法,但执行后无任何效果,运行print(num_datos.etiquette[0])仍输出'<=50K',请问如何有效修改该列的取值?
尝试过的方法
方法一
num_datos.loc[num_datos.loc[:,"etiquette"]=="<=50K", "etiquette"]=1 num_datos.loc[num_datos.loc[:,"etiquette"]==">50K", "etiquette"]=0
方法二
num_datos['etiquette'].replace(['<=50K'], 1) num_datos['etiquette'].replace(['>50K'], 0)
解决方案
针对方法二的修正
replace方法默认不会直接修改原DataFrame,而是返回一个修改后的新对象。你需要加上inplace=True参数让修改生效,或者将结果重新赋值给原列:
方式1:使用inplace参数
num_datos['etiquette'].replace(['<=50K', '>50K'], [1, 0], inplace=True)
方式2:重新赋值
num_datos['etiquette'] = num_datos['etiquette'].replace({'<=50K': 1, '>50K': 0})
更简洁的替代方法
可以用map方法直接完成映射替换,代码更简洁高效:
num_datos['etiquette'] = num_datos['etiquette'].map({'<=50K': 1, '>50K': 0})
方法一无效的可能原因及修正
方法一无效大概率是因为你操作的是DataFrame的视图而非副本,导致赋值无法同步到原数据。可以先确保操作的是副本,或者简化写法:
# 先创建副本(如果原数据是视图的话) num_datos = num_datos.copy() # 再执行赋值 num_datos.loc[num_datos["etiquette"] == "<=50K", "etiquette"] = 1 num_datos.loc[num_datos["etiquette"] == ">50K", "etiquette"] = 0
执行上述任意一种修正方法后,再运行print(num_datos.etiquette[0])就能得到预期的数值1了。
内容的提问来源于stack exchange,提问作者slow_learner
相关产品推荐
相关产品推荐

