如何将格式应用于groupby函数?

时间:2018-04-06 23:56:11

标签: python pandas dataframe rounding

我有以下DataFrame:

      High  counts   Total
11  1.2492       2  2.4984
1   1.2466       2  2.4932
20  1.2574       1  1.2574
19  1.2547       1  1.2547
18  1.2523       1  1.2523

我使用了以下行来分组

hg = grps.groupby("High").size().reset_index(name='counts')

我正在尝试按以下格式按此DataFrame进行分组。但是High的值不能改变。

{:.3f} # 1.249, 1.246, 1.257 ...

是否可以这样做或者我应该创建一个新的DataFrame?

修改

这是预期的输出

      High  counts   Total  New
11  1.2492       2  2.4984  1.249
1   1.2466       2  2.4932  1.246
20  1.2574       1  1.2574  1.257
19  1.2547       1  1.2547  1.254
18  1.2523       1  1.2523  1.252

2 个答案:

答案 0 :(得分:2)

我认为需要使用numpy.floorvalues将值转换为numpy数组,并按浮点数和最后一次除以相同值后的数值转换:

N = 3
df['New'] = np.floor(df['High'].values * 10 ** N) / 10 ** N
print (df)
      High  counts   Total    New
11  1.2492       2  2.4984  1.249
1   1.2466       2  2.4932  1.246
20  1.2574       1  1.2574  1.257
19  1.2547       1  1.2547  1.254
18  1.2523       1  1.2523  1.252

另一种解决方案:

df['New'] = (df['High'].values * 10**N).astype(int) / 10**N

快速比较:

#[5000 rows x 4 columns]
df = pd.concat([df] * 1000, ignore_index=True)

In [213]: %timeit df['New1'] = df['High'].map(truncate)
8.27 ms ± 667 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [214]: %timeit df['New1'] = np.floor(df['High'].values * 10 ** N) / 10 ** N
220 µs ± 2.98 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

答案 1 :(得分:1)

您可以使用math.floorpd.Series.map自定义公式。

import math

def truncate(f, n=3):
    return math.floor(f * 10 ** n) / 10 ** n

df['New'] = df['High'].map(truncate)

#       High  counts   Total    New
# 11  1.2492       2  2.4984  1.249
# 1   1.2466       2  2.4932  1.246
# 20  1.2574       1  1.2574  1.257
# 19  1.2547       1  1.2547  1.254
# 18  1.2523       1  1.2523  1.252

请注意,由于您开始使用float数据,因此floating point arithmetic可能仍会遇到问题。