基于参考碱基条件对数据集指定列分组求和的技术问询
数据集处理:按ref值规则计算A、B列求和结果
我把你的需求拆解成了原始数据展示、求和规则明确、处理结果输出,还加了自动化处理的代码实现,方便你直接复用:
原始数据集
先把你提供的原始数据转成更易读的Markdown表格:
| scaf | pos | ref | A-1 | A-2 | A-3 | A-4 | B-1 | B-2 | B-3 | B-4 |
|---|---|---|---|---|---|---|---|---|---|---|
| MT1 | 11722 | A | 330 | 0 | 0 | 0 | 111 | 0 | 0 | 0 |
| MT1 | 11723 | T | 0 | 230 | 0 | 8 | 0 | 18 | 0 | 2 |
| MT1 | 11724 | A | 222 | 2 | 6 | 0 | 56 | 8 | 0 | 0 |
明确求和规则
根据ref列的不同取值,对A、B系列列执行对应的求和逻辑:
- 当
ref = A:- A列 = A-2 + A-3 + A-4
- B列 = B-2 + B-3 + B-4
- 当
ref = T:- A列 = A-1 + A-3 + A-4
- B列 = B-1 + B-3 + B-4
- 当
ref = C:- A列 = A-1 + A-2 + A-4
- B列 = B-1 + B-2 + B-4
- 当
ref = G:- A列 = A-1 + A-2 + A-3
- B列 = B-1 + B-2 + B-3
处理后的结果集
按照规则计算后,得到的目标结果如下:
| scaf | pos | ref | A | B |
|---|---|---|---|---|
| MT1 | 11722 | A | 0 | 0 |
| MT1 | 11723 | T | 8 | 2 |
| MT1 | 11724 | A | 8 | 8 |
自动化处理代码(Python Pandas)
如果你的数据集很大,手动计算效率太低,用Pandas可以快速实现批量处理,代码如下:
import pandas as pd # 构造原始数据(如果是从文件读取,用pd.read_csv()即可) data = { 'scaf': ['MT1', 'MT1', 'MT1'], 'pos': [11722, 11723, 11724], 'ref': ['A', 'T', 'A'], 'A-1': [330, 0, 222], 'A-2': [0, 230, 2], 'A-3': [0, 0, 6], 'A-4': [0, 8, 0], 'B-1': [111, 0, 56], 'B-2': [0, 18, 8], 'B-3': [0, 0, 0], 'B-4': [0, 2, 0] } df = pd.DataFrame(data) # 定义每行的求和逻辑 def compute_ab_sum(row): ref_val = row['ref'] # 计算A列的值 if ref_val == 'A': a_total = row['A-2'] + row['A-3'] + row['A-4'] elif ref_val == 'T': a_total = row['A-1'] + row['A-3'] + row['A-4'] elif ref_val == 'C': a_total = row['A-1'] + row['A-2'] + row['A-4'] elif ref_val == 'G': a_total = row['A-1'] + row['A-2'] + row['A-3'] else: a_total = 0 # 应对未知ref值的情况 # 计算B列的值,规则和A列一致 if ref_val == 'A': b_total = row['B-2'] + row['B-3'] + row['B-4'] elif ref_val == 'T': b_total = row['B-1'] + row['B-3'] + row['B-4'] elif ref_val == 'C': b_total = row['B-1'] + row['B-2'] + row['B-4'] elif ref_val == 'G': b_total = row['B-1'] + row['B-2'] + row['B-3'] else: b_total = 0 return pd.Series([a_total, b_total], index=['A', 'B']) # 应用函数并生成结果 result_df = df[['scaf', 'pos', 'ref']].join(df.apply(compute_ab_sum, axis=1)) print(result_df)
运行这段代码后,就能直接得到上面的结果集,后续如果有更多行数据,只需要替换原始数据部分即可。
内容的提问来源于stack exchange,提问作者AP38
相关产品推荐
相关产品推荐

