我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

目光聚焦到dataframe数据,在python中,给数据进行分组的方式就是.groupby(),得到的数据结果就是的groupby分组对象,本文主要探讨查看groupby数据的几种方法。

苏南大叔:数据清洗,查看groupby分组数据的几种方法总结 - 数据清洗groupby
数据清洗,查看groupby分组数据的几种方法总结(图1-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码经验文章。本文测试环境:python@3.12.3pandas@2.2.2numpy@1.26.4。根据不同的数据查看目标,可以分为以下几种数据查看方案。

前置内容

有如下几篇前置阅读内容,有助于帮助你可以更好的理解本文。

本文的龙套数据,依然是苏南大叔的宠物列表。

import pandas as pd
df = pd.DataFrame( data = [
        ['虎子', 3, "狗"],
        ['老许', 3, "猫"],
        ['二赖子', 6, "狗"],
        ['老白', 6, "猫"],
        ['小黑', 5, "狗"],
    ],
    columns = ['name', 'age', 'category']
)

多重分组

.groupby()可以设置多个grouby,比如下面的苏南大叔的宠物数据中,可以这样普通分组。

g0 = df.groupby('category')
g1 = df.groupby('age')

先按种类进行分类,再按年龄进行分类。

g2 = df.groupby(['category', 'age'])
g3 = df.groupby(['age', 'category'])

但是,下面的写法是错误的!!!

# 错误的写法
# g4 = df.groupby('category').groupby('age')
# g5 = df.groupby('age').groupby('category')

数据查看

.groupby()的返回值是个pandas.core.groupby.generic.DataFrameGroupBy对象。如果想要查看里面的数据的话,需要对它进行循环。例如:

def view_group(_group):
    for name, group in _group:
        print(f'group name: {name}')
        print(group)
        print('\n')
view_group(g0)

输出:

group name: 狗
    name   age  category
0    虎子    3        狗
2  二赖子    6        狗
4    小黑    5        狗


group name: 猫
   name   age  category
1   老许    3        猫
3   老白    6        猫
view_group(g2)

多重分组的输出结果中,可以看到组名产生了很大的变化,从字符串变成了元组数据:

group name: ('狗', 3)
   name   age  category
0   虎子    3        狗


group name: ('狗', 5)
    name  age  category
4   小黑    5        狗


group name: ('狗', 6)
    name   age  category
2  二赖子    6        狗


group name: ('猫', 3)
   name   age  category
1   老许    3        猫


group name: ('猫', 6)
    name  age  category
3   老白    6        猫

查看特定组数据

从上面的数据输出,可以看到:一共分成了两个组:“猫”和“狗”。那么,可以明确的指明要查看的数据:

print(g0.get_group("猫"))
print(g0.get_group("狗"))

输出:

   name   age  category
1   老许    3        猫
3   老白    6        猫

    name  age  category
0   虎子    3        狗
2  二赖子   6        狗
4   小黑    5        狗

多重分组的时候,组名就是个元组了。

print(g2.get_group(("猫",3)))
print(g3.get_group((5,"狗")))

输出:

   name   age  category
1   老许    3        猫

   name   age  category
4   小黑    5        狗

.first().last()

每组被分组的数据,都有第一条和最后一条。那么,

分离出每组数据的第一条数据就是.first()操作。

print(g0.first())

输出:

           name   age
category
狗          虎子    3
猫          老许    3

分离出每组数据的最后一条数据就是.last()操作。

print(g0.last())

输出:

           name   age
category
狗          小黑    5
猫          老白    6

多重分组的情况下,测试数据:

print(g2.first())
print(g3.last())

输出:

               name
category age
狗        3     虎子
          5     小黑
          6    二赖子
猫        3     老许
          6     老白

                name
age category
3   狗          虎子
    猫          老许
5   狗          小黑
6   狗          二赖子
    猫          老白
对于某些特殊情况下,这种.first().last()还是很好用的,不过确实有丢失数据的危险。

.head(n) 和 .tail(n)【不推荐】

可以设置n为一个特别大的值,以期待输出所有数据。

print(g0.head(df.shape[0]))
print(g1.tail(len(df)))

输出:

    name  age  category
0   虎子    3        狗
1   老许    3        猫
2  二赖子   6        狗
3   老白    6        猫
4   小黑    5        狗

这个数据输出虽然确实得到了全部数据,完全丢失了分组效果,所以不推荐。

获取dataframe的条数的方式,使用len(df)或者df.shape[0]

.reset_index()重置索引

groupby对象,是无法重置索引的。

print(g0.reset_index())

输出:

AttributeError: 'DataFrameGroupBy' object has no attribute 'reset_index'. Did you mean: '_get_index'?

但是每一个分组可以。

print(g0.first().reset_index())
print(g0.get_group("猫").reset_index())

输出:

   category  name   age
0        狗   虎子    3
1        猫   老许    3

   index   name  age  category
0      1   老许    3        猫
1      3   老白    6        猫

强转为dataframe

groupby虽然不可以直接查看,但是dataframe可以。所以,可以强制转化为dataframe类型,再进行查看。

print(pd.DataFrame(g1))

输出:

        0      1
0  (狗, 3)    name  age category
0             虎子    3        狗
1  (狗, 5)    name  age category
4             小黑    5        狗
2  (狗, 6)    name  age category
2             二赖子    6      狗
3  (猫, 3)    name  age category
1             老许    3        猫
4  (猫, 6)    name  age category
3             老白    6        猫
很奇特的数据输出。

结束语

本文存在的更多意义在于:重温数据清洗的过程中的数据分组操作,并对其加深更多的认识。特别是如何查看分组数据的方法,进行了深入总结。更多苏南大叔的python文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python