如何高效获取目录下各Pickle文件的数据行数?
解决方案
1. 仅读取每个Pickle文件的行数(无需合并)
不用加载并合并所有数据,逐个读取文件后直接获取行数即可,大幅降低内存占用和耗时:
import pandas as pd import glob, os # 注意用原始字符串避免路径转义问题 files = glob.glob(r'O:\Stack\Over\Flow\*.pkl') file_row_stats = [] for fp in files: # 读取单个文件后只保留行数信息 single_df = pd.read_pickle(fp, compression='xz') file_row_stats.append({ 'filename': os.path.basename(fp), 'row_count': len(single_df) # 等价于 single_df.shape[0] }) # 转成DataFrame方便查看统计结果 stats_df = pd.DataFrame(file_row_stats) print(stats_df)
2. 合并后统计每个源文件的行数
你的思路完全正确,通过添加文件名列标记数据来源后,用分组统计就能得到每个文件的行数:
优化后的合并代码
import pandas as pd import glob, os files = glob.glob(r'O:\Stack\Over\Flow\*.pkl') dfs_with_source = [] for fp in files: source_filename = os.path.basename(fp) # 给每个DataFrame添加来源文件名列 single_df = pd.read_pickle(fp, compression='xz').assign(source_file=source_filename) dfs_with_source.append(single_df) # 合并所有DataFrame combined_df = pd.concat(dfs_with_source, ignore_index=True)
两种统计行数的方法
- 方法一:用
value_counts快速计数
row_counts = combined_df['source_file'].value_counts().reset_index() row_counts.columns = ['filename', 'row_count'] print(row_counts)
- 方法二:用
groupby分组统计
row_counts = combined_df.groupby('source_file').size().reset_index(name='row_count') print(row_counts)
内容的提问来源于stack exchange,提问作者Jonnyboi
相关产品推荐
相关产品推荐

