如何高效将pandas DataFrame按行数均分分组后绘制平均值堆叠柱状图
你的原代码存在两个问题:一是循环赋值效率低,二是df.iloc[i:i + step]['p'] = i属于链式索引,会触发SettingWithCopyWarning,可能实际无法成功给p列赋值。
下面是两种更高效的实现方式:
方法1:使用pd.qcut等频分箱(最适配需求)
pd.qcut专门用于将数据划分为数量尽可能相等的N个分箱,完全符合你分组行数大致相等的需求,全程向量化操作无循环:
import numpy as np bin_count = 10 # 生成0到bin_count-1的分组标签,每组行数尽可能相等 df['p'] = pd.qcut(np.arange(len(df)), q=bin_count, labels=False) # 分组求均值+绘制堆叠柱状图 df.groupby('p').mean().plot.bar(stacked=True)
方法2:使用整数除法生成分组标签(逻辑最贴近原代码)
如果你希望完全对齐原代码的分组逻辑,用numpy向量化的整数除法替代循环即可,一行就能生成分组标签:
import numpy as np import math bin_count = 10 step = math.ceil(df.shape[0] / bin_count) # 向量化生成分组标签,替代原循环 df['p'] = np.arange(df.shape[0]) // step df.groupby('p').mean().plot.bar(stacked=True)
两种实现都比原循环方案性能高得多,数据量达到万行及以上时优势会非常明显,同时也避免了原代码的链式赋值风险。
内容的提问来源于stack exchange,提问作者v_0ver
相关产品推荐
相关产品推荐

