Pandas高级数据分析快速入门之数据筛选——分组排序筛选实践笔记

首先,读取文件。

import pandas as pd
import datetime
df = pd.read_excel('sport.xlsx')
df['birthday'] = df['birthday'].astype('datetime64')
df
idnameageGendersportbirthday
01001董国建34马拉松1987-03-16
11002苏炳添31百米1989-08-29
21003彭建华24马拉松1996-12-18
31004张德顺25马拉松1996-02-21
41005焦安静25马拉松1995-09-03
51006葛曼棋24百米1997-10-13
61007吴智强27百米1994-04-13
71008谢震业28百米1993-08-17
81009梁小静24百米1997-04-07
91010韦永丽30百米1991-10-11
101011仁青东知布20马拉松2000-10-15
111012张新艳27马拉松1994-02-01

1. 排序

df = df.sort_values(by='birthday',ascending=True)
df
idnameageGendersportbirthday
01001董国建34马拉松1987-03-16
11002苏炳添31百米1989-08-29
91010韦永丽30百米1991-10-11
71008谢震业28百米1993-08-17
111012张新艳27马拉松1994-02-01
61007吴智强27百米1994-04-13
41005焦安静25马拉松1995-09-03
31004张德顺25马拉松1996-02-21
21003彭建华24马拉松1996-12-18
81009梁小静24百米1997-04-07
51006葛曼棋24百米1997-10-13
101011仁青东知布20马拉松2000-10-15

2. 分组筛选

2.1. 分组后,筛选每组最后一条记录

方法一,使用tail()。

df1 = df.groupby('sport', as_index=False).tail(1)
df1
idnameageGendersportbirthday
51006葛曼棋24百米1997-10-13
101011仁青东知布20马拉松2000-10-15

方法二,取倒数第一个,使用nth(-1)。

#取分组后倒数第一条记录
df2 = df.groupby('sport', as_index=False).nth(-1)
df2
idnameageGendersportbirthday
51006葛曼棋24百米1997-10-13
101011仁青东知布20马拉松2000-10-15

2.2. 分组后,筛选每组倒数第二条记录

#取分组后倒数第二条记录
df3 = df.groupby('sport', as_index=False).nth(-2)
df3
idnameageGendersportbirthday
21003彭建华24马拉松1996-12-18
81009梁小静24百米1997-04-07

2.3. 分组后,筛选每组首条记录

df4 = df.groupby('sport', as_index=False).head(1)
df4
idnameageGendersportbirthday
01001董国建34马拉松1987-03-16
11002苏炳添31百米1989-08-29

2.4. 分组后,筛选每组前两条记录(top2)

df5 = df.groupby('sport', as_index=False).head(2)
df5
idnameageGendersportbirthday
01001董国建34马拉松1987-03-16
11002苏炳添31百米1989-08-29
91010韦永丽30百米1991-10-11
111012张新艳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
idnameageGendersportbirthday
01002苏炳添31百米1989-08-29
11007吴智强27百米1994-04-13
21008谢震业28百米1993-08-17
31010韦永丽30百米1991-10-11
41001董国建34马拉松1987-03-16
51004张德顺25马拉松1996-02-21
61005焦安静25马拉松1995-09-03
71012张新艳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
idnameageGendersportbirthday
01001董国建34马拉松1987-03-16
111012张新艳27马拉松1994-02-01
41005焦安静25马拉松1995-09-03
31004张德顺25马拉松1996-02-21
21003彭建华24马拉松1996-12-18
101011仁青东知布20马拉松2000-10-15

2.7. 分组后,使用Filter筛选

filter函数是用来筛选其中全体组的(既每个组的全体),传入的值应当是布尔标量,如果这个组有一个不满足条件,整个组都被过滤掉了


df8 = df.groupby('sport', as_index=False).filter(lambda x: (x.age>20).all())
df8
idnameageGendersportbirthday
11002苏炳添31百米1989-08-29
51006葛曼棋24百米1997-10-13
61007吴智强27百米1994-04-13
71008谢震业28百米1993-08-17
81009梁小静24百米1997-04-07
91010韦永丽30百米1991-10-11
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖永威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值