【问题标题】:Pandas: How to find the binned mean of a columnPandas:如何找到列的分箱均值
【发布时间】:2019-06-25 19:53:02
【问题描述】:

我们如何有效地找到 pandas 数据框中列的分箱均值?

我喜欢将列分成 5 个部分,并找出每个部分的平均值。

这是我所做的:

import numpy as np
import pandas as pd

df = pd.DataFrame({'x': np.arange(20)})
n_bins = 5
dfs = np.array_split(df,n_bins)

x_means = [x.mean()[0] for x in dfs]
n_elems = len(df) // n_bins
x_mean_lst = [[i]*n_elems for i in x_means]
x_mean_array = np.array(x_mean_lst).flatten()
df['x_bin_mean'] = x_mean_array
df

这似乎比必要的复杂。有没有更好的选择?

输出应如下所示:

     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
10  10         9.5
11  11         9.5
12  12        13.5
13  13        13.5
14  14        13.5
15  15        13.5
16  16        17.5
17  17        17.5
18  18        17.5
19  19        17.5

【问题讨论】:

  • 你很接近,只需使用 groupby。 df.groupby(np.arange(df.shape[0]) // n_elems).transform('mean')

标签: python python-3.x pandas numpy dataframe


【解决方案1】:

我猜你想要类似的东西

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

在这种情况下,请使用 Alollz 的有用建议 pd.qcut

df.groupby(pd.qcut(df.index, n_bins))['x'].transform('mean')

【讨论】:

  • @ALollz 谢谢!我在写答案时没有看到这一点,但绝对要提防。我已经编辑过了。
猜你喜欢
  • 2016-11-25
  • 1970-01-01
  • 2019-03-08
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多