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

按指定列分组的堆叠DataFrame中变量间比值计算问题

解决方案

问题出在你的calculate_ratio函数仅当分组同时存在td和ts时才生成ratio行,缺少任意一个就返回空DataFrame,导致C、D组没有对应的ratio行。我们需要调整函数逻辑,让每个分组都生成ratio行,缺失值时QC留空(用NaN表示)。

修改后的代码

import pandas as pd

# 构造示例数据
data = [
    ['A', 'S1', 'td', 2],
    ['A', 'S1', 'ts', 4],
    ['A', 'S2', 'td', 6],
    ['A', 'S2', 'ts', 3],
    ['B', 'S1', 'td', 20],
    ['B', 'S1', 'ts', 40],
    ['B', 'S2', 'td', 60],
    ['B', 'S2', 'ts', 30],
    ['C', 'S1', 'td', 90],
    ['D', 'S2', 'ts', 7]
]
df_in = pd.DataFrame(data, columns=['G1', 'G2', 'TPE', 'QC'])

def calculate_ratio(group):
    # 获取分组内的td和ts值,不存在则为缺失值
    td_val = group.loc[group['TPE'] == 'td', 'QC'].values[0] if not group[group['TPE'] == 'td'].empty else pd.NA
    ts_val = group.loc[group['TPE'] == 'ts', 'QC'].values[0] if not group[group['TPE'] == 'ts'].empty else pd.NA
    
    # 仅当两个值都存在时计算比值,否则留空
    ratio = ts_val / td_val if pd.notna(td_val) and pd.notna(ts_val) else pd.NA
    
    # 每个分组都返回ratio行
    return pd.DataFrame({
        'G1': [group['G1'].iloc[0]],
        'G2': [group['G2'].iloc[0]],
        'TPE': ['ratio'],
        'QC': [ratio]
    })

# 生成所有分组的ratio行
ratio_rows = df_in.groupby(['G1', 'G2'], group_keys=False).apply(calculate_ratio).reset_index(drop=True)

# 合并原数据和ratio行
df_out = pd.concat([df_in, ratio_rows], ignore_index=True)

# 可选:按G1、G2排序,让同组的原数据和ratio行聚集在一起
df_out = df_out.sort_values(by=['G1', 'G2'], ignore_index=True)

print(df_out)

代码说明

  • 调整calculate_ratio函数逻辑:先分别提取分组内的td和ts值,不存在则标记为pd.NA(Pandas标准缺失值)。
  • 仅当td和ts值都存在时,才计算ts/td的比值,否则QC列留空。
  • 强制每个分组都返回包含ratio的DataFrame,确保C、D这类不完整分组也能生成对应的ratio行。
  • 合并原数据与ratio行后,可通过排序让同组的原始数据和ratio行相邻,和预期输出结构一致。

输出结果

运行后会得到与你预期完全一致的df_out,其中C、D组的ratio行QC列显示为空白(对应Pandas的NaN缺失值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:12:43