如何按行列对比DataFrame?统计多列差值超3的行数
解决CSV逐列统计差值大于3的次数问题
完整实现代码
import pandas as pd # 读取两个CSV文件,保留原有行列结构(题目说明二者行列完全一致) dk = pd.read_csv('C:/Users/D/1_top_a.csv', sep=',', header=None) dl = pd.read_csv('C:/Users/D/1_top_b.csv', sep=',', header=None) # 移除全为空的行和列(若确认数据无全空行列可省略) dk = dk.dropna(how='all').dropna(how='all', axis=1) dl = dl.dropna(how='all').dropna(how='all', axis=1) # 校验处理后两个文件的行列数一致,避免计算出错 assert dk.shape == dl.shape, "两个文件处理后行列数不匹配,请检查数据" # 计算对应元素差值的绝对值,统计每列中差值大于3的次数 diff_counts = (abs(dk - dl) > 3).sum(axis=0) # 输出结果:索引为列序号,值为对应列差值大于3的行数 print(diff_counts)
代码说明
- 数据读取:直接读取两个CSV文件,契合题目中"二者行列数量完全一致"的前提。
- 空值清理:保留你原代码中的
dropna操作,用于过滤全空的行或列。 - 一致性校验:用
assert确保处理后的两个DataFrame结构完全匹配,防止因数据异常导致计算错误。 - 高效计算:利用Pandas矢量化特性,直接对整个数据集做差值判断并按列求和,比逐行循环效率高得多,尤其适合200列的大数据量场景。
- 结果解读:
diff_counts是一个Series对象,索引为列的序号(从0开始),对应的值就是该列中差值大于3的行的数量。
逐列循环实现方案(不推荐,效率较低)
如果一定要补全你原代码中的for循环逻辑,可参考以下写法:
rows = dk.shape[0] cols = dk.shape[1] diff_counts = [] for i in range(cols): # 取出第i列的所有数据 col_a = dk.iloc[:, i] col_b = dl.iloc[:, i] # 统计当前列差值大于3的次数 count = sum(abs(col_a - col_b) > 3) diff_counts.append(count) # 转换为Series方便查看列号对应关系 diff_counts = pd.Series(diff_counts, index=range(cols)) print(diff_counts)
内容的提问来源于stack exchange,提问作者hannabellamontaha
相关产品推荐
相关产品推荐

