使用pandas对单列进行四舍五入

116

在Pandas中,是否有一种方法可以对单个列进行四舍五入,而不影响数据框中的其他部分?

>>> print(df)
  item  value1  value2
0    a    1.12     1.3
1    a    1.50     2.5
2    a    0.10     0.0
3    b    3.30    -1.0
4    b    4.80    -1.0

我已尝试以下方法:

>>> df.value1.apply(np.round)
0    1
1    2
2    0
3    3
4    5
5    5

正确的方法是令数据看起来像这样:

  item  value1  value2
0    a       1     1.3
1    a       2     2.5
2    a       0     0.0
3    b       3    -1.0
4    b       5    -1.0
5    c       5     5.0
8个回答

129

你已经非常接近了。 你对由df.value1给出的值系列应用了round函数。 因此,返回类型是Series。 你需要将该系列重新分配给数据帧(或具有相同索引的另一个数据帧)。

此外,还有一个pandas.Series.round方法,它基本上是pandas.Series.apply(np.round)的简写形式。

>>> df.value1 = df.value1.round()
>>> print df
  item  value1  value2
0    a       1     1.3
1    a       2     2.5
2    a       0     0.0
3    b       3    -1.0
4    b       5    -1.0

1
谢谢。错过这个让我感觉不太聪明 :) - k3it
1
Pandas 对我来说并不自然。我相当确定是在上周阅读了另一个 StackOverflow 的答案之后才弄明白了该如何做。但我再也找不到那个问题了,所以可能是一个稍微不同的问题。 - Frames Catherine White
2
@LyndonWhite 可以使用 df["value1"].round() 吗?还有一个 向上取整向下取整 的函数吗?如果列名中有空格怎么办?例如 value 1 - 我假设 df.value 1.round() 会失败? - 3kstc
3
看起来你有三个问题。请使用“提问”按钮三次。 - Frames Catherine White
你甚至可以通过输入 df.round() 来对整个数据框进行四舍五入,无需为每一列单独指定。 - rishi jain

86

由于某些原因,如果您有许多小数位的浮点数,round()方法可能不起作用,但是这种方法可以。

decimals = 2    
df['column'] = df['column'].apply(lambda x: round(x, decimals))

9
df.column_name.round()似乎适用于输出格式。lambda函数的应用实际上更改了基础存储的值。 - Stephan Doliov
@StephanDoliov 没错,精度问题一直困扰着我。round() 只能设置显示精度而不能存储值。 - seizetheday
2
这会导致SettingWithCopyWarning警告。 - WJA

33

使用 pandas.DataFrame.round() 方法,如下所示:

df = df.round({'value1': 0})

没有包括在内的任何列将保持不变。


这是最好的答案。如果只有它有一个inplace参数就更好了。 - braaterAfrikaaner
@braaterAfrikaaner inplace已被弃用,并将在未来的pandas版本中移除。 - Michael Currie

20
不需要使用for循环,可以直接应用于数据框的列。
sleepstudy['Reaction'] = sleepstudy['Reaction'].round(1)

9

如果您正在进行机器学习并使用tensorflow,许多float类型是'float32'而不是'float64',因此在本线程中提到的方法都不太可能适用。您需要首先将其转换为float64。

x.astype('float')

在round(...)之前。


6

无需使用lambda或创建函数。这很简单,如下所示:

df['decimal_place_2'] = df['decimal_place_2'].round(2)

2
我认为需要更新这个问题的答案... Tx - Je Je

5
saldo_acred['cumsum_prc_saldo'].astype('float').round(2)

1
在我的情况下,我在单个列中既有字符串值又有十进制值。
def round_2(x):
    try:
        return round(x,2)
    except:
        return x

df['cur_TMIN_IMD_WeekSum']=df['cur_TMIN_IMD_WeekSum'].apply(round_2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接