You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SQLite3与Pandas更高效地处理图书库数据统计?

我正在处理一个包含整个图书馆图书详情的大型数据库,需要获取馆藏的各类统计数据。例如,我编写了如下代码来定义获取馆藏数量最多的前10位作者的方法:

def most_owned_authors():
    db = 'database.db'
    conn = sqlite3.connect(db)
    cursor = conn.cursor()

    cursor.execute('''SELECT AUTHOR AS author FROM MAINTABLE WHERE OWNEDCHECKBOX = TRUE;''')

    authors_df = pd.DataFrame(cursor.fetchall())

    authors = []
    author_dict = {}

    for x in authors_df.iloc:
        authors.append(x.to_string(index=False))
    for x in authors:
        amount = authors.count(x)
        author_dict[x] = amount

    author_dict = dict(sorted(author_dict.items(), key=lambda item: item[1], reverse=True))

    top_10_owned_authors = {}

    for x, k in enumerate(author_dict):
        if x == 10: break
        top_10_owned_authors[k] = author_dict[k]

请问是否有更简便的方式,使用SQLite3和Pandas从SQL查询生成统计数据?是否必须像上述示例那样手动编写逻辑?能否通过SQL的SUM/COUNT函数对重复条目进行统计后,直接从DataFrame中提取结果?另外,类似的需求还有生成标记为“已读”的图书及其阅读年份的DataFrame,该如何实现?

优化方案说明

1. 简化馆藏最多的前10位作者统计

完全不需要手动编写Python循环统计,直接用SQL的COUNT()和GROUP BY就能在数据库层面完成统计,再结合Pandas直接读取结果,效率和简洁性都远高于原代码。

优化后的代码

import sqlite3
import pandas as pd

def most_owned_authors():
    db = 'database.db'
    conn = sqlite3.connect(db)
    
    # 直接用SQL完成分组统计、排序并取前10
    query = '''
        SELECT AUTHOR AS author, COUNT(*) AS book_count
        FROM MAINTABLE 
        WHERE OWNEDCHECKBOX = TRUE
        GROUP BY AUTHOR
        ORDER BY book_count DESC
        LIMIT 10;
    '''
    # Pandas直接读取查询结果为DataFrame
    top_10_df = pd.read_sql_query(query, conn)
    conn.close()
    
    # 如果需要字典格式,直接转换即可
    top_10_dict = top_10_df.set_index('author')['book_count'].to_dict()
    return top_10_dict, top_10_df

优势说明

  • 数据库引擎处理分组统计的效率远高于Python循环,面对大型数据库时能大幅减少内存占用和计算时间
  • 代码逻辑清晰,避免手动循环可能出现的重复统计、字符串处理错误等问题
  • 直接得到结构化的DataFrame,方便后续分析或可视化操作

2. 生成已读图书及阅读年份的DataFrame

同样通过SQL过滤已读条目,指定需要的字段后,用Pandas直接读取结果即可:

实现代码

def get_read_books_with_year():
    db = 'database.db'
    conn = sqlite3.connect(db)
    
    # 假设标记已读的字段是READCHECKBOX,阅读年份字段是READ_YEAR
    query = '''
        SELECT BOOK_TITLE, AUTHOR, READ_YEAR
        FROM MAINTABLE 
        WHERE READCHECKBOX = TRUE
        -- 可选:按阅读年份排序
        ORDER BY READ_YEAR DESC;
    '''
    read_books_df = pd.read_sql_query(query, conn)
    conn.close()
    
    # 若READ_YEAR存储为字符串,可转换为日期类型
    read_books_df['READ_YEAR'] = pd.to_datetime(read_books_df['READ_YEAR'], format='%Y')
    return read_books_df

额外统计扩展

如果需要统计每年的已读图书数量,直接在SQL中加入分组统计即可:

SELECT READ_YEAR, COUNT(*) AS read_count
FROM MAINTABLE 
WHERE READCHECKBOX = TRUE
GROUP BY READ_YEAR
ORDER BY READ_YEAR DESC;

内容的提问来源于stack exchange,提问作者Kyle Carroll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:42:58