如何用Pandas对比同结构DataFrame,统计各列差值非零行数?
解决CSV文件逐列差值统计问题
实现思路
你不需要用双重循环,Pandas的矢量化操作能更高效地完成这个需求:
- 先确保两个DataFrame的行列数一致(处理空值后验证)
- 直接计算两个DataFrame的差值(
dk - dl) - 对每列统计差值大于0的行数
完善后的代码
import pandas as pd # 读取并清理数据 dk = pd.read_csv('C:/Users/D/1_top_a.csv', sep=',', header=None) dk = dk.dropna(how='all').dropna(how='all', axis=1) dl = pd.read_csv('C:/Users/D/1_top_b.csv', sep=',', header=None) dl = dl.dropna(how='all').dropna(how='all', axis=1) # 验证两个DataFrame形状是否一致(避免后续出错) assert dk.shape == dl.shape, "两个文件的行列数必须一致" # 计算差值并统计每列差值大于0的行数 diff_counts = (dk - dl > 0).sum(axis=0) # 输出结果:索引是列号,值是对应列的符合条件的行数 print(diff_counts) # 如果需要按列号输出具体结果,比如列1有55行,可以遍历打印 for col_num, count in diff_counts.items(): print(f"第{col_num+1}列中差值大于0的行数:{count}")
代码说明
dk - dl > 0:生成一个布尔值DataFrame,每个位置表示对应单元格的差值是否大于0.sum(axis=0):按列求和,布尔值True会被当作1,False当作0,直接得到每列符合条件的行数- 加入
assert语句可以提前检测两个文件的行列是否匹配,避免后续计算出错
如果一定要用双重循环实现(不推荐,效率低),可以这样修改你的代码:
import pandas as pd dk = pd.read_csv('C:/Users/D/1_top_a.csv', sep=',', header=None) dk = dk.dropna(how='all').dropna(how='all', axis=1) dl = pd.read_csv('C:/Users/D/1_top_b.csv', sep=',', header=None) dl = dl.dropna(how='all').dropna(how='all', axis=1) # 初始化结果字典,存储每列的统计数 col_counts = {col: 0 for col in range(dk.shape[1])} rows = dk.shape[0] cols = dk.shape[1] for col in range(cols): for row in range(rows): # 计算dk[row,col] - dl[row,col] > 0 if dk.iloc[row, col] - dl.iloc[row, col] > 0: col_counts[col] += 1 # 输出结果 for col_num, count in col_counts.items(): print(f"第{col_num+1}列中差值大于0的行数:{count}")
内容的提问来源于stack exchange,提问作者helloitsmontie
相关产品推荐
相关产品推荐

