Pandas fillna传入numpy数组触发Invalid fill value报错
报错产生原因
fillna方法的value参数仅支持传入标量、字典、Series、DataFrame类型的填充值,不支持直接传入numpy ndarray数组。你代码里np.where(df['d'].str['c'] == "C", "Y", "N")返回的是一维numpy数组,类型不符合参数要求,因此直接触发类型报错。- 原写法逻辑也存在偏差:你构造的填充值是和行数等长的一维序列,直接传给整个DataFrame的fillna时,pandas无法识别这个序列要按行匹配填充哪一列的空值,且
d列存储的是字典/空值,本身也不需要用"Y"/"N"字符串填充。
正确修改方案
你的预期逻辑是:根据同一行d列字典中c字段的值,填充c列的空值——当d列字典的c字段等于"C"时填"Y",否则填"N",d列原有空值保留。
实现代码如下(注意原构造代码缺失numpy导入,已补全):
import pandas as pd import numpy as np df = pd.DataFrame({ 'c': [np.nan, 'N', np.nan, 'N'], 'd': [{'c':'C'}, np.nan, {'c':'C'}, np.nan] }) # 仅针对c列填充,将np.where结果转为和原表索引对齐的Series传入fillna df['c'] = df['c'].fillna( pd.Series(np.where(df['d'].str['c'] == "C", "Y", "N"), index=df.index) )
执行后得到的DataFrame结果如下:
| 索引 | c | d |
|---|---|---|
| 0 | Y | {'c': 'C'} |
| 1 | N | NaN |
| 2 | Y | {'c': 'C'} |
| 3 | N | NaN |
修改点说明:
- 仅对需要填充空值的
c列调用fillna,避免误修改d列的原始数据 - 将numpy数组转为与原DataFrame索引一致的Series,既符合fillna的参数类型要求,也能保证填充值和行号一一对应,不会出现填充错位。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

