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

将AWK多分支条件计算逻辑转换为Python(Pandas)实现

将AWK多分支条件计算转换为Pandas实现

原始数据

data = {'f_geno': ["AA", "AA", "AA", "BB", "BB", "BB", "AB", "AB", "AB"],
        'ch_geno': ["AA", "AB", "BB", "AA", "AB", "BB", "AA", "BB", "AB"],
        'freq_A': [0.50, 0.46, 0.49, 0.57, 0.55, 0.44, 0.37, 0.66, 0.46],
        'freq_B': [0.50, 0.54, 0.51, 0.43, 0.45, 0.56, 0.63, 0.34, 0.54]
        }

原始AWK脚本

BEGIN {
    FS = OFS = ","
}
{
    if ($1 == "AA" && $2 == "AA") {
        $5 = (1 / $3)
    } else if ($1 == "AA" && $2 == "AB") {
        $5 = (0.5 / $3)
    } else if ($1 == "AA" && $2 == "BB") {
        $5 = (0.001)
    } else if ($1 == "BB" && $2 == "AA") {
        $5 = (0.001)
    } else if ($1 == "BB" && $2 == "AB") {
        $5 = (0.5 / $4)
    } else if ($1 == "BB" && $2 == "BB") {
        $5 = (1 / $4) 
    } else if ($1 == "AB" && $2 == "AA") {
        $5 = (0.5 / $3)
    } else if ($1 == "AB" && $2 == "BB") {
        $5 = (0.5 / $4)  
    } else {
        $5 = (($3 + $4) / (4 * $3 * $4))
    }
    
    print 
}

Pandas实现方案

使用numpy.select批量处理条件计算,效率远高于逐行apply,适合大数据量场景:

import pandas as pd
import numpy as np

# 创建DataFrame
df = pd.DataFrame(data)

# 定义条件列表与对应计算结果
conditions = [
    (df['f_geno'] == 'AA') & (df['ch_geno'] == 'AA'),
    (df['f_geno'] == 'AA') & (df['ch_geno'] == 'AB'),
    (df['f_geno'] == 'AA') & (df['ch_geno'] == 'BB'),
    (df['f_geno'] == 'BB') & (df['ch_geno'] == 'AA'),
    (df['f_geno'] == 'BB') & (df['ch_geno'] == 'AB'),
    (df['f_geno'] == 'BB') & (df['ch_geno'] == 'BB'),
    (df['f_geno'] == 'AB') & (df['ch_geno'] == 'AA'),
    (df['f_geno'] == 'AB') & (df['ch_geno'] == 'BB')
]

results = [
    1 / df['freq_A'],
    0.5 / df['freq_A'],
    0.001,
    0.001,
    0.5 / df['freq_B'],
    1 / df['freq_B'],
    0.5 / df['freq_A'],
    0.5 / df['freq_B']
]

# 应用条件计算,default对应AWK的else分支
df['calc_result'] = np.select(conditions, results, default=(df['freq_A'] + df['freq_B']) / (4 * df['freq_A'] * df['freq_B']))

# 输出结果
print(df)

运行结果

得到的DataFrame包含新计算列calc_result,与AWK脚本输出完全一致:

indexf_genoch_genofreq_Afreq_Bcalc_result
0AAAA0.500.502.000000
1AAAB0.460.541.086957
2AABB0.490.510.001000
3BBAA0.570.430.001000
4BBAB0.550.451.111111
5BBBB0.440.561.785714
6ABAA0.370.631.351351
7ABBB0.660.340.735294
8ABAB0.460.540.975610

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:30:46