Pandas高级数据分析快速入门之数据筛选——分组排序筛选实践笔记
Posted 肖永威
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas高级数据分析快速入门之数据筛选——分组排序筛选实践笔记相关的知识,希望对你有一定的参考价值。
首先,读取文件。
import pandas as pd
import datetime
df = pd.read_excel('sport.xlsx')
df['birthday'] = df['birthday'].astype('datetime64')
df
id | name | age | Gender | sport | birthday | |
---|---|---|---|---|---|---|
0 | 1001 | 董国建 | 34 | 男 | 马拉松 | 1987-03-16 |
1 | 1002 | 苏炳添 | 31 | 男 | 百米 | 1989-08-29 |
2 | 1003 | 彭建华 | 24 | 男 | 马拉松 | 1996-12-18 |
3 | 1004 | 张德顺 | 25 | 女 | 马拉松 | 1996-02-21 |
4 | 1005 | 焦安静 | 25 | 女 | 马拉松 | 1995-09-03 |
5 | 1006 | 葛曼棋 | 24 | 女 | 百米 | 1997-10-13 |
6 | 1007 | 吴智强 | 27 | 男 | 百米 | 1994-04-13 |
7 | 1008 | 谢震业 | 28 | 男 | 百米 | 1993-08-17 |
8 | 1009 | 梁小静 | 24 | 女 | 百米 | 1997-04-07 |
9 | 1010 | 韦永丽 | 30 | 女 | 百米 | 1991-10-11 |
10 | 1011 | 仁青东知布 | 20 | 男 | 马拉松 | 2000-10-15 |
11 | 1012 | 张新艳 | 27 | 女 | 马拉松 | 1994-02-01 |
1. 排序
df = df.sort_values(by='birthday',ascending=True)
df
id | name | age | Gender | sport | birthday | |
---|---|---|---|---|---|---|
0 | 1001 | 董国建 | 34 | 男 | 马拉松 | 1987-03-16 |
1 | 1002 | 苏炳添 | 31 | 男 | 百米 | 1989-08-29 |
9 | 1010 | 韦永丽 | 30 | 女 | 百米 | 1991-10-11 |
7 | 1008 | 谢震业 | 28 | 男 | 百米 | 1993-08-17 |
11 | 1012 | 张新艳 | 27 | 女 | 马拉松 | 1994-02-01 |
6 | 1007 | 吴智强 | 27 | 男 | 百米 | 1994-04-13 |
4 | 1005 | 焦安静 | 25 | 女 | 马拉松 | 1995-09-03 |
3 | 1004 | 张德顺 | 25 | 女 | 马拉松 | 1996-02-21 |
2 | 1003 | 彭建华 | 24 | 男 | 马拉松 | 1996-12-18 |
8 | 1009 | 梁小静 | 24 | 女 | 百米 | 1997-04-07 |
5 | 1006 | 葛曼棋 | 24 | 女 | 百米 | 1997-10-13 |
10 | 1011 | 仁青东知布 | 20 | 男 | 马拉松 | 2000-10-15 |
2. 分组筛选
2.1. 分组后,筛选每组最后一条记录
方法一,使用tail()。
df1 = df.groupby('sport', as_index=False).tail(1)
df1
id | name | age | Gender | sport | birthday | |
---|---|---|---|---|---|---|
5 | 1006 | 葛曼棋 | 24 | 女 | 百米 | 1997-10-13 |
10 | 1011 | 仁青东知布 | 20 | 男 | 马拉松 | 2000-10-15 |
方法二,取倒数第一个,使用nth(-1)。
#取分组后倒数第一条记录
df2 = df.groupby('sport', as_index=False).nth(-1)
df2
id | name | age | Gender | sport | birthday | |
---|---|---|---|---|---|---|
5 | 1006 | 葛曼棋 | 24 | 女 | 百米 | 1997-10-13 |
10 | 1011 | 仁青东知布 | 20 | 男 | 马拉松 | 2000-10-15 |
2.2. 分组后,筛选每组倒数第二条记录
#取分组后倒数第二条记录
df3 = df.groupby('sport', as_index=False).nth(-2)
df3
id | name | age | Gender | sport | birthday | |
---|---|---|---|---|---|---|
2 | 1003 | 彭建华 | 24 | 男 | 马拉松 | 1996-12-18 |
8 | 1009 | 梁小静 | 24 | 女 | 百米 | 1997-04-07 |
2.3. 分组后,筛选每组首条记录
df4 = df.groupby('sport', as_index=False).head(1)
df4
id | name | age | Gender | sport | birthday | |
---|---|---|---|---|---|---|
0 | 1001 | 董国建 | 34 | 男 | 马拉松 | 1987-03-16 |
1 | 1002 | 苏炳添 | 31 | 男 | 百米 | 1989-08-29 |
2.4. 分组后,筛选每组前两条记录(top2)
df5 = df.groupby('sport', as_index=False).head(2)
df5
id | name | age | Gender | sport | birthday | |
---|---|---|---|---|---|---|
0 | 1001 | 董国建 | 34 | 男 | 马拉松 | 1987-03-16 |
1 | 1002 | 苏炳添 | 31 | 男 | 百米 | 1989-08-29 |
9 | 1010 | 韦永丽 | 30 | 女 | 百米 | 1991-10-11 |
11 | 1012 | 张新艳 | 27 | 女 | 马拉松 | 1994-02-01 |
2.5. 按条件筛选分组
df6 = df.groupby('sport', as_index=False).apply(lambda x: x.loc[x.loc[x['age']>24].index]).reset_index(drop=True)
df6
id | name | age | Gender | sport | birthday | |
---|---|---|---|---|---|---|
0 | 1002 | 苏炳添 | 31 | 男 | 百米 | 1989-08-29 |
1 | 1007 | 吴智强 | 27 | 男 | 百米 | 1994-04-13 |
2 | 1008 | 谢震业 | 28 | 男 | 百米 | 1993-08-17 |
3 | 1010 | 韦永丽 | 30 | 女 | 百米 | 1991-10-11 |
4 | 1001 | 董国建 | 34 | 男 | 马拉松 | 1987-03-16 |
5 | 1004 | 张德顺 | 25 | 女 | 马拉松 | 1996-02-21 |
6 | 1005 | 焦安静 | 25 | 女 | 马拉松 | 1995-09-03 |
7 | 1012 | 张新艳 | 27 | 女 | 马拉松 | 1994-02-01 |
2.6. 分组后,按组筛选
第一步,建立分组。
df_grouped = df.groupby('sport', as_index=False)
df_grouped
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001F2B7102518>
第二步,分组后,按组筛选数据。
df7 = df_grouped.get_group('马拉松')
df7
id | name | age | Gender | sport | birthday | |
---|---|---|---|---|---|---|
0 | 1001 | 董国建 | 34 | 男 | 马拉松 | 1987-03-16 |
11 | 1012 | 张新艳 | 27 | 女 | 马拉松 | 1994-02-01 |
4 | 1005 | 焦安静 | 25 | 女 | 马拉松 | 1995-09-03 |
3 | 1004 | 张德顺 | 25 | 女 | 马拉松 | 1996-02-21 |
2 | 1003 | 彭建华 | 24 | 男 | 马拉松 | 1996-12-18 |
10 | 1011 | 仁青东知布 | 20 | 男 | 马拉松 | 2000-10-15 |
2.7. 分组后,使用Filter筛选
filter函数是用来筛选其中全体组的(既每个组的全体),传入的值应当是布尔标量,如果这个组有一个不满足条件,整个组都被过滤掉了
df8 = df.groupby('sport', as_index=False).filter(lambda x: (x.age>20).all())
df8
id | name | age | Gender | sport | birthday | |
---|---|---|---|---|---|---|
1 | 1002 | 苏炳添 | 31 | 男 | 百米 | 1989-08-29 |
5 | 1006 | 葛曼棋 | 24 | 女 | 百米 | 1997-10-13 |
6 | 1007 | 吴智强 | 27 | 男 | 百米 | 1994-04-13 |
7 | 1008 | 谢震业 | 28 | 男 | 百米 | 1993-08-17 |
8 | 1009 | 梁小静 | 24 | 女 | 百米 | 1997-04-07 |
9 | 1010 | 韦永丽 | 30 | 女 | 百米 | 1991-10-11 |
以上是关于Pandas高级数据分析快速入门之数据筛选——分组排序筛选实践笔记的主要内容,如果未能解决你的问题,请参考以下文章