df.fillna(0) 命令无法将 NaN 值替换为 0。

4

我正在尝试将以下代码中生成的NaN值替换为0。但我不明白为什么以下代码不起作用。它仍然保留着NaN值。

df_pubs=pd.read_sql("select Conference, Year, count(*) as totalPubs from publications where year>=1991 group by conference, year", db)

df_pubs['Conference'] = df_pubs['Conference'].str.encode('utf-8')

df_pubs = df_pubs.pivot(index='Conference', columns='Year', values='totalPubs')
df_pubs.fillna(0)

print df_pubs

print df 会输出以下内容:

Year                                                                                       1991  \
Conference                                                                                        
                                                                                            223   
10th Anniversary Colloquium of UNU/IIST                                                     NaN   
15. WLP                                                                                     NaN   
1999 ACM SIGMOD Workshop on Research Issues in Data Mining and Knowledge Discovery          NaN   
25 Years CSP                                                                                NaN  

1
你需要使用 df_pubs = df_pubs.fillna(0)fillna 不会修改原始的 DataFrame。 - TomAugspurger
1
大多数pandas操作默认情况下返回副本,有些具有参数inplace=True - EdChum
1个回答

7

您需要为fillna指定结果:

df_pubs = df_pubs.fillna(0)

或者使用参数inplace=True
df_pubs.fillna(0, inplace=True)

请参阅文档
您可以将您的代码修改为以下内容:
df_pubs = df_pubs.pivot(index='Conference', columns='Year', values='totalPubs').fillna(0)

这样可以工作,但是填充(fillna)是否易于理解还有待商榷。


我尝试使用以下代码将df保存为SQL表格:df_pubs.to_sql('conferences_pubs', db, flavor='sqlite', if_exists='replace', index=True)index=False 时,它可以正常工作,但是我需要会议名称(即索引)被添加为一列,所以当我设置 index=True 时,它会给出一个错误:ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str)。强烈建议您改用Unicode字符串。有任何想法为什么会这样吗? - BKS
我不确定,但听起来你的数据库编码没有设置为接受utf-8,你能改变一下吗?老实说,我对这个话题不是很了解,如果你还卡住了,我建议你发一个新问题。 - EdChum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接