如何使用Python读取大型CSV文件并完成分组聚合统计计算
Pandas方案可行性结论
300MB的CSV文件属于中小规模数据集,用Pandas处理完全可行,普通办公电脑都可以流畅运行,不需要额外搭建PySpark、Hadoop等大数据环境,对Python新手非常友好。
具体实现步骤
- 第一步:读取CSV文件
建议只加载需要的核心字段,减少内存占用,还可以手动指定字段类型避免数据异常(比如邮编开头的0被自动转为数字后丢失):
import pandas as pd # 读取文件,usecols指定只加载需要的字段,dtype手动指定字段类型优化内存和数据准确性 df = pd.read_csv( "你的事故数据文件路径.csv", usecols=["Month", "Date", "Year", "Pincode", "Count"], dtype={"Pincode": str, "Count": int} )
- 第二步:按要求分组汇总
如果需要全量日期的各邮编事故总数:
# 按日期+邮编分组,对Count求和,as_index=False保证分组字段保留为普通列 total_df = df.groupby(["Month", "Date", "Year", "Pincode"], as_index=False)["Count"].sum()
如果只需要计算指定日期的结果,可以先过滤再分组,进一步提升运行效率:
# 示例:筛选2024年6月1日的所有数据 target_df = df[(df["Year"] == 2024) & (df["Month"] == 6) & (df["Date"] == 1)] # 对指定日期数据按邮编分组求和 target_total_df = target_df.groupby("Pincode", as_index=False)["Count"].sum()
- 第三步:结果存储
如果要存为CSV文件:
# index=False表示不把Pandas的行索引存入文件 total_df.to_csv("各邮编每日事故总数汇总.csv", index=False)
如果要存入数据库,直接用Pandas自带的to_sql方法对接对应数据库的Python驱动即可。
超大文件扩展方案
如果后续你需要处理的文件增长到数GB、超过当前设备内存,可以不用直接切换到PySpark,用Pandas的分块读取功能就能处理:
chunk_result = [] # 按10万行每块拆分读取文件 for chunk in pd.read_csv( "超大事故数据文件.csv", usecols=["Month", "Date", "Year", "Pincode", "Count"], dtype={"Pincode": str, "Count": int}, chunksize=100000 ): # 对每个块先做预聚合 chunk_agg = chunk.groupby(["Month", "Date", "Year", "Pincode"], as_index=False)["Count"].sum() chunk_result.append(chunk_agg) # 合并所有块的预聚合结果,再做一次全局汇总得到最终结果 final_total = pd.concat(chunk_result).groupby(["Month", "Date", "Year", "Pincode"], as_index=False)["Count"].sum()
内容的提问来源于stack exchange,提问作者Tabber
相关产品推荐
相关产品推荐

