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
相关产品推荐
相关产品推荐

