首页 > 解决方案 > 分成行数大致相等的组,并用平均值绘制条形图

问题描述

我有很多行:

df = pd.DataFrame(columns = ['param_1', 'param_2', ..., 'param_n'])

我需要将行分成几组并显示带有平均值的堆叠条:

bin_count = 10
step = math.ceil(df.shape[0] / bin_count)
df['p'] = 0
for i in range(0, df.shape[0], step):
    df.iloc[i:i + step]['p'] = i
df_group = df.groupby('p').mean()
df_group.plot.bar(stacked = True)

如何更有效地做到这一点?

标签: pythonpandas

解决方案


用于通过根据 DataFrame 的长度pd.qcut传递它来拆分rangeDataFrame。

样本数据

import pandas as pd
import numpy as np

# 111 rows to split into (10) groups
Nr = 111
df = pd.DataFrame({'param_1': np.random.randint(0, 10, Nr),
                   'param_2': range(Nr)})

代码

# Number of bins
bin_count = 10  
df_group = df.groupby(pd.qcut(range(len(df)), bin_count, labels=False)).mean()

df_group.plot.bar(stacked=True, rot=0)

在此处输入图像描述


考虑到数据的长度,这将形成尽可能接近均匀大小的组,类似于np.array_split

df.groupby(pd.qcut(range(len(df)), bin_count, labels=False)).size()

0    12
1    11
2    11
3    11
4    11
5    11
6    11
7    11
8    11
9    11
dtype: int64

推荐阅读