【问题标题】:How can I apply a format to a groupby function?如何将格式应用于 groupby 函数?
【发布时间】:2018-04-06 23:56:10
【问题描述】:

我有以下数据框:

      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

【问题讨论】:

  • 你说你想按那个分组(是的,这是可能的)但是你想从中得到什么?如果进行聚合,最终的行数会比开始时少。在这种情况下,您将如何在多个可能的行中进行选择?你可能想转型?你最后没有告诉我们你想要什么。这是这个问题的关键部分。
  • 其实我做到了。以下行是输出:{:.3f} # 1.249, 1.246, 1.257 ...
  • @DonCoder - 你需要df['New'] = df['High'].map('{:.3f}'.format) 吗?还是df['New'] = df['High'].round(3)

标签: python pandas dataframe rounding


【解决方案1】:

我认为需要 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)

【讨论】:

  • @DonCoder - 很高兴得到帮助!
【解决方案2】:

您可以使用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

请注意,您可能仍会遇到floating point arithmetic 的问题,因为您是从float 数据开始的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2021-11-20
    • 2017-11-04
    • 2018-06-19
    • 2017-04-20
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多