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

Pandas中isnumeric结果为False时替换值并按SKU填充NaN的实现问题

Pandas 按条件生成并填充SKU2列解决方案

报错原因

你之前遇到TypeError: bad operand type for unary ~: 'float'的核心原因是:
Series.str.isnumeric()仅会对字符串类型的单元格返回布尔值,当SKU列为数值类型(比如示例中的0是int类型)时,调用该方法会返回NaN,而~取反运算符无法对NaN执行运算,因此报错。

正确实现代码

通用严谨写法(支持分组乱序场景)

符合你提到的「按SKU分组填充」需求,即使分组行不连续也能正确计算:

import pandas as pd
import numpy as np

# 你的原始DF示例
df = pd.DataFrame({
    'SKU': ['SKU_ABC', 0, 0, 0, 'SKU_ACD', 0, 0],
    'SKU2': [False, np.nan, np.nan, np.nan, False, np.nan, np.nan]
})

# 1. 统一转字符串判断是否为纯数字,避免返回NaN
is_numeric_sku = df['SKU'].astype(str).str.isnumeric()

# 2. 为每个非数值SKU生成分组ID
df['group_id'] = (~is_numeric_sku).cumsum()

# 3. 按分组取第一个SKU值填充整个分组的SKU2
df['SKU2'] = df.groupby('group_id')['SKU'].transform('first')

# 可选:删除辅助列group_id
df = df.drop(columns=['group_id'])

简洁写法(仅适合同分组行连续的规整数据)

如果你的数据和示例一样,非数值SKU和对应下属行是连续排列的,可以直接用前向填充简化代码:

is_numeric_sku = df['SKU'].astype(str).str.isnumeric()
df['SKU2'] = df['SKU'].where(~is_numeric_sku).ffill()

输出结果

两种写法运行后都能得到你预期的结果:

SKU     SKU2
0  SKU_ABC  SKU_ABC
1        0  SKU_ABC
2        0  SKU_ABC
3        0  SKU_ABC
4  SKU_ACD  SKU_ACD
5        0  SKU_ACD
6        0  SKU_ACD

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:27:06