【问题标题】:How to round calculations with pandas如何用熊猫四舍五入计算
【发布时间】:2020-10-27 20:10:37
【问题描述】:
我知道如何在 pandas (link) 中简单地对列进行四舍五入,但是,我的问题是如何在 pandas 中同时进行四舍五入和计算。
df['age_new'] = df['age'].apply(lambda x: round(x['age'] * 0.024319744084, 0.000000000001))
TypeError: 'float' object is not subscriptable
有什么办法吗?
【问题讨论】:
标签:
python
pandas
data-manipulation
【解决方案1】:
-
.apply 未矢量化。
- 在
pandas.Series 上使用.apply 时,如'age',lambda 变量,x 是'age' 列,因此正确的语法是round(x * 0.0243, 4)
-
round 的ndigits 参数需要int,而不是float。
- 使用矢量化方法更快,例如
.mul,然后是.round。
- 在这种情况下,有 1000 行,矢量化方法比使用
.apply 快 4 倍。
import pandas as pd
import numpy as np
# test data
np.random.seed(365)
df = pd.DataFrame({'age': np.random.randint(110, size=(1000))})
%%timeit
df.age.mul(0.024319744084).round(5)
[out]:
212 µs ± 3.86 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
(df['age'] * 0.024319744084).round(5)
[out]:
211 µs ± 9.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
df.age.apply(lambda x: round(x * 0.024319744084, 5))
[out]:
845 µs ± 20.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
【解决方案2】:
有两个问题:
-
括号内的
x['age'] 不需要['age'],因为您已经应用于age 列(这就是您收到错误的原因)
-
round 将 int 作为第二个参数。
试试
df['age_new'] = df['age'].apply(lambda x: round(x * 0.024319744084, 5))
(5 只是一个例子。)