我有以下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
答案 0 :(得分:2)
我认为需要使用numpy.floor
和values
将值转换为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.floor
和pd.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可能仍会遇到问题。