数据清洗,查看groupby分组数据的几种方法总结
发布于 作者:苏南大叔 来源:程序如此灵动~
目光聚焦到dataframe数据,在python中,给数据进行分组的方式就是.groupby(),得到的数据结果就是的groupby分组对象,本文主要探讨查看groupby数据的几种方法。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码经验文章。本文测试环境:python@3.12.3,pandas@2.2.2,numpy@1.26.4。根据不同的数据查看目标,可以分为以下几种数据查看方案。
前置内容
有如下几篇前置阅读内容,有助于帮助你可以更好的理解本文。
- https://newsn.net/say/dataframe-groupby.html
- https://newsn.net/say/pandas-dataframe.html
- https://newsn.net/say/python-tuple.html
本文的龙套数据,依然是苏南大叔的宠物列表。
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文章,请参考: