十年的某图书馆读者借阅记录,有读者号(uid)、图书号(bid)、图书标题(title)和借阅日期(date)四个列。
练习:
1)查询《人间词话》的借阅情况
2)查询2016年的借阅情况
3)查询1084420用户在2016年的借阅情况
4)查询2016、2018和2019年的借阅情况
5)查询借阅了1103310所借图书的用户
6)查询每个用户借了多少书
7)查询借书最多的10位用户
8)查询每个用户最早几几年借书
9)查询每个用户每年借书借了几本书
10)查询平均年借书量最多的十位用户
代码:
df[df['title'] == '人间词话']
解释:通过布尔索引,筛选出借阅记录中标题为“人间词话”的所有记录。
代码:
df[df['date'].dt.year == 2016]
解释:通过布尔索引,筛选出借阅日期为2016年的所有记录。其中dt.year
是pandas中时间类型数据的属性,表示年份。
代码:
df[(df['uid'] == 1084420) & (df['date'].dt.year == 2016)]
解释:通过在布尔索引中使用&符号进行“与”操作,同时筛选出借阅人为1084420且借阅日期在2016年的记录。
代码:
df[df['date'].dt.year.isin([2016, 2018, 2019])]
解释:利用pandas中Series的isin方法,筛选出借阅日期在2016、2018和2019年的所有记录。
代码:
df[df['bid'] == 1103310]['uid'].unique()
解释:通过筛选出图书号为1103310的所有记录,然后选取唯一的借阅人id。
代码:
df.groupby('uid')['bid'].count()
解释:利用pandas中的groupby方法,按照借阅人id进行分组,然后对每组的图书数量进行统计计数。
代码:
df.groupby('uid')['bid'].count().nlargest(10)
解释:首先按照借阅人id进行分组,然后使用pandas中的nlargest方法取出图书借阅数量最多的前10位用户。
代码:
df.groupby('uid')['date'].agg('min').dt.year
解释:使用groupby方法按照借阅人id进行分组,然后使用agg方法聚合每个用户的最早借书日期,最后提取这个日期的年份。
代码:
df.groupby(['uid', df['date'].dt.year])['bid'].count()
解释:使用groupby方法按照借阅人id和年份进行分组,然后统计每个用户每年借书的数量。
代码:
df.groupby('uid')['bid'].count().groupby(df['date'].dt.year).mean().nlargest(10)
解释:首先按照借阅人id进行分组,统计每个用户的总借书量。然后再按照年份进行分组,统计每年的平均借书量。最后通过nlargest方法取出平均年借书量最多的前10位用户。
df[df['title']=='人间词话']
df[df['date'].str.startswith('2016')]
df[(df['uid']==1084420) & (df['date'].str.startswith('2016'))]
df[df['date'].str.startswith(('2016','2018', '2019'))]
df[df['bid']==1103310]['uid']
df.groupby('uid')['bid'].count()
df.groupby('uid').size().nlargest(10)
df.groupby('uid')['date'].min().str[:4]
df['year'] = df['date'].str[:4]; df.groupby(['uid', 'year']).size()
df.groupby('uid')['bid'].count().groupby(level=0).mean().nlargest(10)