我有一个包含大量ID的巨大数据框中的以下ID,我特别选择这个以显示问题是什么
id year anual_jobs anual_wage
874180 20001150368 2010 10.5 1071.595917
在此代码之后
df.anual_jobs= df.anual_jobs.round()
我收到此错误但代码仍会运行。
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-
docs/stable/indexing.html#indexing-view-versus-copy
self[name] = value
我的结果是:
id year anual_jobs anual_wage
874180 20001150368 2010 10.0 1071.595917
当我想将anual_jobs舍入到11.0而不是10.0
时答案 0 :(得分:4)
正如@cᴏʟᴅsᴘᴇᴇᴅ指出的那样,这种情况正在发生,因为numpy将半值舍入到最接近的偶数整数(参见文档here和更一般的讨论here),并且pandas使用numpy进行大多数它的数字工作。您可以通过舍入“老式”方式来解决这个问题:
import numpy as np
df.anual_jobs = np.floor(df.anual_jobs + 0.5)
或
import pandas as pd
df.anual_jobs = pd.np.floor(df.anual_jobs + 0.5)
正如@cᴏʟᴅsᴘᴇᴇᴅ指出的那样,你也可以通过将数据帧创建为独立的帧而不是旧数据帧上的视图来解决切片分配警告,即在将值分配给数据帧之前的某个时刻执行以下操作:
df = df.copy()
答案 1 :(得分:1)
如果你想要的是因为半整数使用decimal
from decimal import Decimal, ROUND_HALF_UP
print(Decimal(10.5).quantize(0, ROUND_HALF_UP))
print(Decimal(10.2).quantize(0, ROUND_HALF_UP))
>> 11
>> 10