Полагаю, вы хотите что-то вроде
df.groupby(df.index // (len(df) // n_bins))['x'].transform('mean')
или, если ваш индекс не числовой,
df.groupby(pd.RangeIndex(len(df)) // (len(df) // n_bins))['x'].transform('mean')
Вот как будет выглядеть группировщик и вывод для n_bins = 5
,
df.index // (len(df) // 5)
# Int64Index([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4], dtype='int64')
df['x_bin_mean'] = (
df.groupby(df.index // (len(df) // 5))['x'].transform('mean'))
df.head(10)
x x_bin_mean
0 0 1.5
1 1 1.5
2 2 1.5
3 3 1.5
4 4 5.5
5 5 5.5
6 6 5.5
7 7 5.5
8 8 9.5
9 9 9.5
Обратите внимание, что целочисленное деление, хотя и быстрое, может не обрабатывать случаи, когда индекс не делится поровну:
Я не уверен, что целочисленное деление является полностью правильным (если что-то
не делите равномерно). Например, с длиной 16 и n_bins = 5
Вы получаете 6 групп —Alollz
В этом случае воспользуйтесь полезным предложением Алолца pd.qcut
:
df.groupby(pd.qcut(df.index, n_bins))['x'].transform('mean')