如何用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
相关产品推荐
相关产品推荐

