Pandas按Product与Code分组填充Supplier非空值时触发ValueError求助
解决Pandas分组填充缺失值的ValueError问题
错误原因
你的代码触发ValueError: Must specify a fill 'value' or 'method',是因为部分分组的supplier列没有非空值,调用first()后得到的是NaN,此时用fillna(NaN)相当于没有提供有效填充值,导致报错。比如apple+Code=2的分组,所有supplier都是空值,就会出现这种情况。
修正方案
使用transform直接对分组进行处理,同时判断分组是否存在非空值,避免无效填充:
import pandas as pd # 创建示例数据 test = pd.DataFrame({ 'product': ['apple', 'apple', 'apple','apple','banana', 'banana', 'orange', 'orange','orange'], 'Code': [1,2,1,1,3,3,4,5,4], 'supplier': [None, None, None, 'Acme Inc.', 'Cotsco ', None, None, 'Target', None], 'quantity': [99,58,100, 200, 150, 50, 300, 20,400] }) # 按product和Code分组,用每组第一个非空值填充组内缺失 test['supplier'] = test.groupby(['product', 'Code'])['supplier'].transform( lambda x: x.fillna(x.dropna().iloc[0]) if not x.dropna().empty else x ) print(test)
代码说明
transform方法会对每个分组执行操作,并返回与原DataFrame长度匹配的结果,无需额外合并步骤- 先通过
x.dropna().empty判断分组是否存在非空值:- 若存在非空值,取第一个非空值(
x.dropna().iloc[0])填充组内所有缺失 - 若不存在非空值,保留原缺失值,避免触发填充无效的错误
- 若存在非空值,取第一个非空值(
运行结果
product Code supplier quantity 0 apple 1 Acme Inc. 99 1 apple 2 None 58 2 apple 1 Acme Inc. 100 3 apple 1 Acme Inc. 200 4 banana 3 Cotsco 150 5 banana 3 Cotsco 50 6 orange 4 None 300 7 orange 5 Target 20 8 orange 4 None 400
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

