如何在Pandas中按page分组对pageviews进行最大最小归一化?
高效实现Pandas DataFrame按组的最大最小归一化
针对你需要对pageviews字段按page分组做最大最小归一化(Min-Max Scaling)的需求,结合10万行数据的效率要求,推荐使用Pandas的**分组变换(groupby + transform)**方案,这是处理这类分组计算最高效的方式之一,完全避开了循环操作带来的性能损耗。
实现代码
先还原你的测试DataFrame结构(方便验证):
import pandas as pd data = { 'page': ['example.com/a', 'example.com/a', 'example.com/a', 'example.com/b', 'example.com/b', 'example.com/b'], 'days since publishing': [1, 2, 3, 1, 2, 3], 'pageviews': [5000, 10000, 7500, 10000, 20000, 15000] } df = pd.DataFrame(data)
然后执行核心的归一化操作:
def min_max_scale(x): return (x - x.min()) / (x.max() - x.min()) # 按page分组后对pageviews字段应用归一化变换 df['pageviews'] = df.groupby('page')['pageviews'].transform(min_max_scale)
执行后就能得到你期望的结果:
page days since publishing pageviews 0 example.com/a 1 0.0 1 example.com/a 2 1.0 2 example.com/a 3 0.5 3 example.com/b 1 0.0 4 example.com/b 2 1.0 5 example.com/b 3 0.5
优化补充:处理边界情况
如果你的数据中存在某个分组的pageviews最大值和最小值相等(比如该分组所有页面浏览量都一致),可以给归一化函数加个判断,避免出现除以0的错误:
def min_max_scale(x): x_min = x.min() x_max = x.max() return (x - x_min) / (x_max - x_min) if x_max != x_min else 0.0
方案效率说明
Pandas的groupby.transform是基于向量化操作实现的,比手动遍历每个分组的效率高一个数量级,完全适配10万行级别的数据量,不会出现明显的性能瓶颈。
内容的提问来源于stack exchange,提问作者Tomsky
相关产品推荐
相关产品推荐

