【问题标题】:Pandas: Group by rounded floating numberPandas:按四舍五入的浮点数分组
【发布时间】:2016-04-13 13:03:39
【问题描述】:

我有一个带有一列浮点数的数据框。例如:

df = pd.DataFrame({'A' : np.random.randn(100), 'B': np.random.randn(100)})

我想要做的是在将 A 列四舍五入到小数点后 2 位后按 A 列分组。

我这样做的方式非常低效:

df.groupby(df.A.map(lambda x: "%.2f" % x))

我特别不想将所有内容都转换为字符串,因为速度会成为一个大问题。但我认为执行以下操作并不安全:

df.groupby(np.around(df.A, 2))

我不确定,但我觉得可能存在两个 float64 数字在四舍五入到小数点后 2 位后具有相同的字符串表示形式的情况,但在 np.around 到小数点后 2 位时的表示形式可能略有不同。例如,1.52 的字符串表示是否可以由 np.around(., 2) 有时表示为 1.52000001 但有时表示为 1.51999999?

我的问题是什么是更好和更有效的方法。

【问题讨论】:

  • 您可以将列A 乘以100 并转换为整数吗?喜欢df.groupby(pd.Series(np.int64(df.A * 100)))?然后只需除以 100.0 即可得到原始值。
  • 我想我可以,但这绝不方便。

标签: pandas group-by


【解决方案1】:

我认为您不需要将浮点数转换为字符串。

import pandas as pd
from random import random
df = pd.DataFrame({'A' : map(lambda x: random(), range(100000)), 'B': map(lambda x: random(), range(100000))})
df.groupby(df['A'].apply(lambda x: round(x, 1))).count()

【讨论】:

  • 如果只需要计数,那么 value_counts 将是可行的方法:df['A'].round(1).value_counts()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 2011-12-22
  • 2011-12-27
  • 2016-04-21
相关资源
最近更新 更多