Python的pandas查询

十年的某图书馆读者借阅记录,有读者号(uid)、图书号(bid)、图书标题(title)和借阅日期(date)四个列。

练习:
1)查询《人间词话》的借阅情况

2)查询2016年的借阅情况

3)查询1084420用户在2016年的借阅情况

4)查询2016、2018和2019年的借阅情况

5)查询借阅了1103310所借图书的用户

6)查询每个用户借了多少书

7)查询借书最多的10位用户

8)查询每个用户最早几几年借书

9)查询每个用户每年借书借了几本书

10)查询平均年借书量最多的十位用户

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7500987
  • 以下回答由chatgpt基于相关博客总结生成:
    1. 查询《人间词话》的借阅情况。

    代码:

    df[df['title'] == '人间词话']
    

    解释:通过布尔索引,筛选出借阅记录中标题为“人间词话”的所有记录。

    1. 查询2016年的借阅情况。

    代码:

    df[df['date'].dt.year == 2016]
    

    解释:通过布尔索引,筛选出借阅日期为2016年的所有记录。其中dt.year是pandas中时间类型数据的属性,表示年份。

    1. 查询1084420用户在2016年的借阅情况。

    代码:

    df[(df['uid'] == 1084420) & (df['date'].dt.year == 2016)]
    

    解释:通过在布尔索引中使用&符号进行“与”操作,同时筛选出借阅人为1084420且借阅日期在2016年的记录。

    1. 查询2016、2018和2019年的借阅情况。

    代码:

    df[df['date'].dt.year.isin([2016, 2018, 2019])]
    

    解释:利用pandas中Series的isin方法,筛选出借阅日期在2016、2018和2019年的所有记录。

    1. 查询借阅了1103310所借图书的用户。

    代码:

    df[df['bid'] == 1103310]['uid'].unique()
    

    解释:通过筛选出图书号为1103310的所有记录,然后选取唯一的借阅人id。

    1. 查询每个用户借了多少书。

    代码:

    df.groupby('uid')['bid'].count()
    

    解释:利用pandas中的groupby方法,按照借阅人id进行分组,然后对每组的图书数量进行统计计数。

    1. 查询借书最多的10位用户。

    代码:

    df.groupby('uid')['bid'].count().nlargest(10)
    

    解释:首先按照借阅人id进行分组,然后使用pandas中的nlargest方法取出图书借阅数量最多的前10位用户。

    1. 查询每个用户最早几年借书。

    代码:

    df.groupby('uid')['date'].agg('min').dt.year
    

    解释:使用groupby方法按照借阅人id进行分组,然后使用agg方法聚合每个用户的最早借书日期,最后提取这个日期的年份。

    1. 查询每个用户每年借书借了几本书。

    代码:

    df.groupby(['uid', df['date'].dt.year])['bid'].count()
    

    解释:使用groupby方法按照借阅人id和年份进行分组,然后统计每个用户每年借书的数量。

    1. 查询平均年借书量最多的十位用户。

    代码:

    df.groupby('uid')['bid'].count().groupby(df['date'].dt.year).mean().nlargest(10)
    

    解释:首先按照借阅人id进行分组,统计每个用户的总借书量。然后再按照年份进行分组,统计每年的平均借书量。最后通过nlargest方法取出平均年借书量最多的前10位用户。

  1. df[df['title']=='人间词话']
  2. df[df['date'].str.startswith('2016')]
  3. df[(df['uid']==1084420) & (df['date'].str.startswith('2016'))]
  4. df[df['date'].str.startswith(('2016','2018', '2019'))]
  5. df[df['bid']==1103310]['uid']
  6. df.groupby('uid')['bid'].count()
  7. df.groupby('uid').size().nlargest(10)
  8. df.groupby('uid')['date'].min().str[:4]
  9. df['year'] = df['date'].str[:4]; df.groupby(['uid', 'year']).size()
  10. df.groupby('uid')['bid'].count().groupby(level=0).mean().nlargest(10)