Pandas .round()未按要求舍入

时间:2017-12-18 17:37:15

标签: python pandas

我有一个包含大量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

2 个答案:

答案 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