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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:05:59