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

如何将Pandas GroupBy转换为DataFrame并实现分组值按Series除法

解决方案:按分组匹配长度的Series做除法

嘿,这个需求其实很好实现,核心就是利用groupby的分组处理能力,针对每个分组匹配对应的除数Series再做运算。我给你两种实用的方案,你可以根据自己的实际场景选择:

方案一:使用groupby.apply自定义处理逻辑

这是最直观的方式,我们可以给每个分组单独匹配对应的除数Series,完成除法后再合并结果。

完整代码示例

import pandas as pd

# 先还原你的原始DataFrame
data = [
    ['sample1', 'method_0', 1],
    ['sample1', 'method_1', 2],
    ['sample1', 'method_2', 3],
    ['sample1', 'method_3', 4],
    ['sample2', 'method_0', 5],
    ['sample2', 'method_1', 6],
    ['sample2', 'method_2', 7],
    ['sample2', 'method_3', 8]
]
table_1 = pd.DataFrame(data, columns=['Sample', 'method', 'value'])

# 这里假设你已经有了每个method对应的除数Series,存在字典里
# 注意:每个Series的长度必须和对应method分组的行数一致!
divisor_dict = {
    'method_0': pd.Series([2, 4]),
    'method_1': pd.Series([1, 3]),
    'method_2': pd.Series([5, 2]),
    'method_3': pd.Series([3, 6])
}

# 执行分组
grouped = table_1.groupby('method')

# 定义处理单个分组的函数
def process_group(group):
    # 获取当前分组的method名称
    current_method = group.name
    # 取出对应的除数Series
    divisor = divisor_dict[current_method]
    
    # 先检查长度是否匹配,避免出错
    if len(divisor) != len(group):
        raise ValueError(f"除数Series长度与分组{current_method}不匹配!")
    
    # 执行除法,生成新列
    group['value_divided'] = group['value'] / divisor.values
    return group

# 应用函数并整理结果
final_result = grouped.apply(process_group).reset_index(drop=True)
print(final_result)

代码说明

  • group.name可以直接获取当前分组的method值,用来匹配对应的除数Series
  • 加入了长度检查,避免因除数和分组行数不一致导致的运算错误
  • 最终返回的final_result会保留原始数据的所有列,同时新增除法后的结果列

方案二:提前合并除数数据到原DataFrame(更简洁)

如果你能把除数数据整理成和原DataFrame匹配的结构,也可以先合并再直接做运算,不需要分组处理:

示例代码

# 构造除数DataFrame,结构和原表对应
divisor_data = [
    ['sample1', 'method_0', 2],
    ['sample1', 'method_1', 1],
    ['sample1', 'method_2', 5],
    ['sample1', 'method_3', 3],
    ['sample2', 'method_0', 4],
    ['sample2', 'method_1', 3],
    ['sample2', 'method_2', 2],
    ['sample2', 'method_3', 6]
]
divisor_df = pd.DataFrame(divisor_data, columns=['Sample', 'method', 'divisor'])

# 合并原表和除数表
merged_df = pd.merge(table_1, divisor_df, on=['Sample', 'method'])

# 直接做除法
merged_df['value_divided'] = merged_df['value'] / merged_df['divisor']
print(merged_df)

适用场景

这种方式更适合除数数据本身就和原数据的Sample+method一一对应的情况,代码更简洁,不需要写自定义函数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:21:20