【问题标题】:Pandas dataframe: Group by two columns and then average the third column熊猫数据框:按两列分组,然后平均第三列
【发布时间】:2019-05-17 17:36:13
【问题描述】:

我有一个如下例所示的数据框:

year    x   y
2016    o   227
2018    o   214
2016    o   56
2018    o   62
2018    o   87
2019    o   40
2017    r   15
2016    i   14
2016    o   88
2014    o   48

我想得到一个输出,其中 y 的平均值是根据 grouby on year 计算的,然后进一步计算 x。像这样的:

year    x   y
2016    o   (227 + 56 + 88)/3 = 123.66 = 124 (Need just the final value)
2018    o   (214 + 62 + 87)/3 = 121 (Need just the final value)
2019    o   40
2017    r   15
2016    i   14
2014    o   48

我想我找到了一种方法(但我可能错了),但结果却是在一个非数据框中:

print(part_b[['year', 'x', 'y']].groupby(['year', 'x']).mean())

生成的输出:(以下输出中的结果来自我的整个数据)

            y
year x                                              
2014 o      48.000000
2016 i      14.000000
     o      117.000000
2017 o      71.000000
     r      27.500000
2018 i      23.000000
     o      97.428571
2019 i      11.000000
     o      115.500000
'''

Whereas I would like to have this:
```python
year x      y                                        
2014 o      48
2016 i      14
2016 o      117
2017 o      71
2017 r      28
2018 i      23
2018 o      97
2019 i      11
2019 o      116
'''

【问题讨论】:

    标签: python python-3.x dataframe group-by


    【解决方案1】:

    鉴于此:

       year category  amount
    0  2015        A     200
    1  2015        B    1000
    2  2015        A     300
    3  2016        C    1200
    4  2016        A     800
    5  2016        A    2500
    6  2016        B     100
    

    这样做:

    df.groupby(['year','category'])['amount'].mean()
    

    会给你:

        year  category
    2015  A            250
          B           1000
    2016  A           1650
          B            100
          C           1200
    Name: amount, dtype: int64
    

    要实现您所需要的,只需执行以下操作:

    df.groupby(['year','category'])['amount'].mean().reset_index()
    
       year category  amount
    0  2015        A     250
    1  2015        B    1000
    2  2016        A    1650
    3  2016        B     100
    4  2016        C    1200
    

    【讨论】:

    • 请注意,您应该在执行 reset_index() 后重命名“amount”列,因为它不能反映它的含义
    猜你喜欢
    • 2018-01-25
    • 2018-02-01
    • 2016-06-05
    • 2020-08-10
    • 2018-11-24
    • 1970-01-01
    • 2019-01-13
    • 2018-07-19
    • 2017-07-08
    相关资源
    最近更新 更多