当前位置: 首页 > Machine Learning, Python > 正文

Pandas Snippet — Group By

#!/usr/bin/env python3

import pandas as pd
import numpy as np

def main():
    ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings',
                         'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'],
                'Rank': [1, 2, 2, 3, 3, 2, 1, 1, 2, 3, 1, 2],
                'Year': [2014, 2015, 2014, 2015, 2014, 2015, 2016, 2017, 2016, 2014, 2015, 2017],
                'Points': [876, 789, 863, 673, 741, 812, 756, 788, 694, 701, 804, 690]}
    df = pd.DataFrame(ipl_data)
    df = df.sort_values(by='Year')

    # 迭代遍历分组
    print('-------------------------------------------------------')
    print(df)
    print('-------------------------------------------------------')
    grouped = df.groupby('Team')
    print(grouped.groups)  # 单列分组
    for key, value in grouped:
        print(key)
        print(value)
        print('-------------------------------------------------------')

    print('-------------------------------------------------------')
    groupby = df.groupby(['Team', 'Year'])
    print(groupby.groups)  # 多列分组,
    for key, value in groupby:  # key 是分组信息, value 还是原来的数据,是一个分组, 包含原来的所有的列(包括分组的列)
        print(key)
        print(value)
        print('-------------------------------------------------------')

    # 选择一个分组
    grouped = df.groupby('Year')
    print('-------------------------------------------------------')
    print(grouped.get_group(2015))  # get_group 的参数是 需要跟原来数据格式匹配, 原来2015是int型, 这里传'2015' 就会报错,

    # 分组聚合
    grouped = df.groupby('Year')
    print('-------------------------------------------------------')
    print(grouped['Points'].agg(np.mean))  # 计算按照Year分组, Points 列的平均数
    print('-------------------------------------------------------')
    print(grouped[['Points', 'Rank']].agg(np.mean))  # 计算多个列的平均数
    print('-------------------------------------------------------')
    print(grouped['Rank'].nunique())  # 计算分组(按Year分组)中 Rank 列不重复值数量
    print('-------------------------------------------------------')
    print(grouped['Points', 'Rank'].agg([np.sum, np.mean, np.std]))  # 分组后, 多个列上应用多个 聚合函数

    # 分组转换
    df = pd.DataFrame(data={'A': [1, 1, 1, 1, 2, 2, 2, 3, 3, 3], 'B': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                            'C': [2, 2, 2, 2, 3, 3, 3, 4, 4, 4], 'D': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]},
                      index=pd.date_range('1/1/2020', periods=10))
    grouped = df.groupby('A')
    print('-------------------------------------------------------')
    print(grouped.agg(np.mean))
    score = lambda x: x + x.mean()  # 将各个分组内的原始数值 替换为 原始数值 + 该分组的平均数,
    # 这里按照A列分组, 氛围三组, 1 - 4行, 2 - 3行, 3 - 3行,
    print('-------------------------------------------------------')
    print(grouped.transform(score))
    """
         B    C    D  # 各列,各分组的 平均值
    A               
    1  1.0  2.0  2.5
    2  1.0  3.0  6.0
    3  1.0  4.0  9.0
    -------------------------------------------------------
                  B    C     D
    2020-01-01  2.0  4.0   3.5  # 第一分组, B列均值为2,所以B列 原始的数值都加上 分组均值2, 全部变成4了,
    2020-01-02  2.0  4.0   4.5
    2020-01-03  2.0  4.0   5.5
    2020-01-04  2.0  4.0   6.5

    2020-01-05  2.0  6.0  11.0  # 第二分组, B列均值为3, B列该分组的当前值 都为 3 + 3 = 6
    2020-01-06  2.0  6.0  12.0
    2020-01-07  2.0  6.0  13.0

    2020-01-08  2.0  8.0  17.0
    2020-01-09  2.0  8.0  18.0
    2020-01-10  2.0  8.0  19.0
    """

    # 过滤
    my_filter = df.groupby('A').filter(lambda x: len(x) > 3)

    print('-------------------------------------------------------')
    print(my_filter)  # 原来的DataFrame中, 属于的分组长度大于3的元素会保留下来,因此,
    """ 只有 A列=1的行会被保留下来,所以这里的输出如下, 可以看到 只有A=1的行被保留下来了, 相当于SQL 里group by之后的Having 语句
                A  B  C  D
    2020-01-01  1  1  2  1
    2020-01-02  1  1  2  2
    2020-01-03  1  1  2  3
    2020-01-04  1  1  2  4
    """

if __name__ == '__main__':
    main()
赞 赏

   微信赞赏  支付宝赞赏


本文固定链接: https://www.jack-yin.com/coding/ml/2726.html | 边城网事

该日志由 边城网事 于2019年03月22日发表在 Machine Learning, Python 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Pandas Snippet — Group By | 边城网事

Pandas Snippet — Group By 暂无评论

发表评论

快捷键:Ctrl+Enter