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

如何用Pandas实现类Excel COUNTIF功能:计算列对差异占比

用Pandas实现分组计数并计算比例

需求说明

现有带表头和行名的DataFrame,需从第二列开始每两列分为一组,统计每组内0和1的出现次数,再分别除以总行数的2倍,最终将结果保存为指定格式的文件。

数据样例

position    1X0812.0    1X0812.1    10192.0 10192.1 10316.0 10316.1 10349.0 10349.1 10418.0 10418.1 10482.0 10482.1
4035    0   0   0   0   0   0   0   1   0   0   0   0
4036    0   0   0   0   0   0   0   1   0   0   0   0
4083    0   0   0   0   1   0   0   1   0   0   0   0
4119    0   1   0   0   1   0   0   1   0   0   0   0
4164    0   1   0   0   1   0   0   1   0   0   0   0
4185    1   1   0   1   1   0   0   1   0   0   0   0
4379    1   1   0   1   0   0   0   1   0   0   0   0

期望输出

0 0.5714 0.8571 0.7142 0.5000 1.0000 1.0000
1 0.4285 0.1428 0.2857 0.5000 0.0000 0.0000

现有代码(未满足需求)

import pandas as pd
df = pd.read_csv('query.tsv', sep='\t')
(df == 0).sum()

解决方案

以下是完整的实现代码,步骤清晰注释:

import pandas as pd

# 1. 读取数据,将position列设为行索引
df = pd.read_csv('query.tsv', sep='\t', index_col='position')

# 2. 按列名前缀分组(如1X0812.0和1X0812.1归为一组)
group_keys = df.columns.str.split('.').str[0]

# 3. 统计每组内0和1的总出现次数
count_0 = (df == 0).sum(axis=0).groupby(group_keys).sum()
count_1 = (df == 1).sum(axis=0).groupby(group_keys).sum()

# 4. 计算比例:分母为总行数×2(每组有2列)
total_entries = len(df) * 2
ratio_0 = count_0 / total_entries
ratio_1 = count_1 / total_entries

# 5. 组合结果为指定格式的DataFrame
result = pd.DataFrame([ratio_0, ratio_1], index=['0', '1'])

# 6. 保存结果到文件,用空格分隔,保留4位小数
result.to_csv('output.txt', sep=' ', header=False, float_format='%.4f')

代码说明

  • 分组逻辑:通过列名的前缀(拆分.前的部分)将每两列归为一组,避免因列顺序变动导致分组错误。
  • 比例计算:每组共有总行数×2个观测值,用0/1的总次数除以该值得到占比。
  • 输出格式:直接生成符合要求的文本格式,无需额外调整。

内容的提问来源于stack exchange,提问作者guidebortoli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:36:34