【问题标题】:How to compute mean for different size subsets within pandas dataframe?如何计算熊猫数据框中不同大小子集的平均值?
【发布时间】:2020-02-10 09:30:55
【问题描述】:

计算 pandas 数据框中每个唯一行子集的特定列的平均值。在以下示例中,每个子集直到 1 出现在“标志”列中,即 (54+34+78+91+29)/5 = 57.2 和 (81+44+61)/3 = 62.0

目前无法根据特定列条件计算不同大小的滚动子集


>>> import pandas as pd
>>> df = pd.DataFrame({"Indx": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "Units": [54, 34, 78, 91, 29, 81, 44, 61, 73, 19], "Flag": [0, 0, 0, 0, 1, 0, 0, 1, 0, 1]})
>>> df
   Indx  Units  Flag
0     1     54     0
1     2     34     0
2     3     78     0
3     4     91     0
4     5     29     1
5     6     81     0
6     7     44     0
7     8     61     1
8     9     73     0
9    10     19     1

# DESIRED OUTPUT
>>> df
   Indx  Units  Flag   avg
0     1     54     0  57.2
1     2     34     0  57.2
2     3     78     0  57.2
3     4     91     0  57.2
4     5     29     1  57.2
5     6     81     0  62.0
6     7     44     0  62.0
7     8     61     1  62.0
8     9     73     0  46.0
9    10     19     0  46.0

【问题讨论】:

    标签: pandas dataframe subset mean


    【解决方案1】:

    使用cumsum然后transform创建组密钥

    df['Units'].groupby(df.Flag.iloc[::-1].cumsum()).transform('mean')
    0    57.2
    1    57.2
    2    57.2
    3    57.2
    4    57.2
    5    62.0
    6    62.0
    7    62.0
    8    46.0
    9    46.0
    Name: Units, dtype: float64
    
    #df['new']=df['Units'].groupby(df.Flag.iloc[::-1].cumsum()).transform('mean')
    

    【讨论】:

    • 翻页::-1好聪明,不错+1
    【解决方案2】:

    最短的解决方案(我认为)是:

    df['avg'] = df.groupby(df.Flag[::-1].cumsum()).Units.transform('mean')
    

    您甚至不需要使用 iloc,因为 df.Flag[::-1] 检索 Flag 列倒序。

    【讨论】:

      猜你喜欢
      • 2018-10-26
      • 1970-01-01
      • 2021-07-19
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      相关资源
      最近更新 更多