数据清洗,查看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
文章,请参考:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。