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

Pandas做分组transform转换忽略NaN值计算权重报除零错误如何解决

Pandas 分组计算Weight2的正确实现

问题根因

原代码存在两个核心问题:

  • 分组后未指定仅对Value列做变换,逻辑不精准,且如果分组内Value全为NaN时会触发除零错误
  • 未对原Value为NaN的行单独做NaN赋值,导致所有行都返回了倒数结果,不符合需求

实现代码

首先构造示例测试数据:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['A', 'A', 'A', 'B', 'B', 'B', 'B'],
    'Value': [1, 2, np.nan, 3, 7, 9, np.nan]
})

已实现的Weight1逻辑可直接保留:

df['Weight 1'] = df.groupby(['Name'])['Value'].transform(lambda x: 1/len(x))

Weight2的正确实现方式:

# 计算每个分组的非NaN Value计数,pandas内置count方法自动忽略NaN
group_valid_count = df.groupby(['Name'])['Value'].transform('count')
# 计算倒数,同时处理除零场景:分组全为NaN时直接返回NaN避免报错
df['Weight 2'] = np.where(group_valid_count == 0, np.nan, 1 / group_valid_count)
# 原Value为NaN的行,Weight2强制设为NaN
df.loc[df['Value'].isna(), 'Weight 2'] = np.nan

输出结果验证

最终输出结果如下:

NameValueWeight 1Weight 2
A1.00.3333330.5
A2.00.3333330.5
ANaN0.333333NaN
B3.00.2500000.333333
B7.00.2500000.333333
B9.00.2500000.333333
BNaN0.250000NaN

结果完全匹配需求:

  • Name A分组非NaN Value共2个,有效行Weight2为1/2=0.5,NaN行对应Weight2为NaN
  • Name B分组非NaN Value共3个,有效行Weight2为1/3≈0.3333,NaN行对应Weight2为NaN
  • 自动兼容分组全为NaN的场景,不会触发除零警告

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:54:03