如何在Pandas DataFrame中按对数刻度将数值分箱到对应阶数?
高效实现Pandas DataFrame数值按10的对数刻度分箱到对应阶数
需求说明
需要将Pandas DataFrame中某列的数值,按10的幂次刻度分箱,映射到对应的阶数。结合预期结果,阶数与数值范围的对应逻辑为:
- 阶数
d对应:10^(d-1) ≤ x < 10^d(d≥0时) - 阶数
d对应:10^d ≤ x < 10^(d+1)(d<0时)
给定示例数据集:
import pandas as pd import numpy as np df = pd.DataFrame(data={'number' : [0.478, 897.12, 12.56, 8.89, 1578.45, 0.089, 0.007]})
预期生成log_10_class列的结果:
| number | log_10_class |
|---|---|
| 0.478 | 0 |
| 897.12 | 3 |
| 12.56 | 2 |
| 8.89 | 1 |
| 1578.45 | 4 |
| 0.089 | -1 |
| 0.007 | -2 |
高效实现方法
利用NumPy的对数与取整函数,一行代码即可完成计算,效率远高于手动分箱:
# 计算log_10_class列 df['log_10_class'] = np.floor(np.log10(df['number'])) + 1 # 处理数值≤0的异常情况(可选,根据需求调整) df.loc[df['number'] <= 0, 'log_10_class'] = np.nan
逻辑解释
np.log10(df['number']):计算每个数值以10为底的对数值np.floor(...):对对数结果向下取整+1:将取整结果偏移1,得到符合预期的阶数- 非正数处理:对数函数对非正数无意义,可根据业务需求标记为
NaN或其他值
验证结果
运行代码后,df的输出与预期完全一致:
print(df) # 输出: # number log_10_class # 0 0.478 0.0 # 1 897.120 3.0 # 2 12.560 2.0 # 3 8.890 1.0 # 4 1578.450 4.0 # 5 0.089 -1.0 # 6 0.007 -2.0
内容的提问来源于stack exchange,提问作者Maxime Oriol
相关产品推荐
相关产品推荐

