【问题标题】:Pandas DataFrame: mean of column B values within column A windowsPandas DataFrame:A列窗口中B列值的平均值
【发布时间】:2019-08-24 21:00:27
【问题描述】:

如果我在 Python 中有一个 pandas DataFrame,如下所示:

import numpy as np
import pandas as pd

a = np.random.uniform(0,10,20)
b = np.random.uniform(0,1,20)
data = np.vstack([a,b]).T

df = pd.DataFrame(data)
df.columns = ['A','B']
df.sort_values(by=['A'])

           A         B
5   0.057519  0.465408
14  1.610972  0.398077
3   1.725556  0.397708
17  1.734124  0.600723
11  1.944105  0.694152
19  3.265799  0.878538
13  3.352460  0.770505
10  3.865299  0.064723
16  4.137863  0.659662
12  5.597172  0.122269
7   5.990105  0.667533
6   6.410582  0.193027
9   6.881429  0.041691
15  7.522877  0.268144
1   8.093155  0.130559
0   8.699004  0.996624
8   8.755095  0.495984
4   9.135271  0.792966
18  9.440045  0.477514
2   9.654226  0.509812

是否可以有效地计算列BA 的间隔中的值的平均值?

例如,您可能想要计算列B 中的值的平均值,这些值属于A 列的bin 范围[0,1,2,3,4,5,6,7,8,9,10]。因此,对于 bin 范围 A = {0-1},落在该 bin 内的 B 值的平均值将是 0.465408,对于 bin 范围 A = {1-2},落在该 bin 内的 B 值的平均值将是 0.522665,等等。

我找到了pandas.core.window.Rolling.mean(请参阅https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.window.Rolling.mean.html),但它似乎是在指定长度的窗口上计算平均值,而不是在另一列的 bin 宽度上计算平均值。

【问题讨论】:

    标签: python pandas dataframe mean binning


    【解决方案1】:

    使用cutA 列分段,然后将groupby 应用于这些分段并计算meanB 值:

    df.groupby(pd.cut(df['A'], bins=np.arange(11)))['B'].mean()
    

    输出:

    A
    (0, 1]     0.465408
    (1, 2]     0.522665
    (2, 3]          NaN
    (3, 4]     0.571255
    (4, 5]     0.659662
    (5, 6]     0.394901
    (6, 7]     0.117359
    (7, 8]     0.268144
    (8, 9]     0.541056
    (9, 10]    0.593431
    

    更新:您可以使用agg 应用一组不同的聚合函数,例如meanstdsize,例如:

    df.groupby(pd.cut(df['A'], bins=np.arange(11)))['B'].agg(['mean', 'std', 'size'])
    

    输出:

                 mean       std  size
    A                                
    (0, 1]   0.465408       NaN     1
    (1, 2]   0.522665  0.149038     4
    (2, 3]        NaN       NaN     0
    (3, 4]   0.571255  0.441983     3
    (4, 5]   0.659662       NaN     1
    (5, 6]   0.394901  0.385560     2
    (6, 7]   0.117359  0.107011     2
    (7, 8]   0.268144       NaN     1
    (8, 9]   0.541056  0.434788     3
    (9, 10]  0.593431  0.173556     3
    

    【讨论】:

    • 有没有办法将每个区间中的值的数量也作为单独的列返回?这样一来,可以使用.std() 而不是.mean(),然后除以样本数,得到每个 bin 的平均值误差。
    • 非常感谢,非常优雅的解决方案!
    • 当然,只要在agg参数列表中添加'median',比如.agg(['mean', 'std', 'size', 'median'])
    • 要计算索引的平均值,您可以使用pd.IntervalIndex(df.index)
    【解决方案2】:

    你可以这样做:

    import numpy as np
    import pandas as pd
    
    a = np.random.uniform(0,10,20)
    b = np.random.uniform(0,1,20)
    data = np.vstack([a,b]).T
    
    df = pd.DataFrame(data=data, columns=['A', 'B'])
    
    bins = pd.cut(df['A'], bins=10)
    df.groupby(bins)['B'].agg({'B': 'mean'}).reset_index()
    

    您还可以向pd.cut 提供垃圾箱列表,例如bins=[0,1,2,3,4,5,6,7,8,9,10].

    【讨论】:

      猜你喜欢
      • 2018-05-11
      • 2018-05-23
      • 2017-08-28
      • 2020-03-11
      • 1970-01-01
      • 2018-09-08
      • 2022-08-14
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多