如何在字典中将 NaN 转换为 0,python

How to Convert NaN to 0 at dictionary, python

我有一些代码:

df = pd.DataFrame.from_dict({ 'sentencess' : sentencess, 'publishedAts' : publishedAts, 'hasil_sentimens' : hasil_sentimens })
df.to_csv('chart.csv')
df['publishedAts'] = pd.to_datetime(df['publishedAts'], errors='coerce')
by_day_sentiment = df.groupby([pd.Grouper(key='publishedAts',freq='D'),'hasil_sentimens']).size().unstack('hasil_sentimens')
sentiment_dict = by_day_sentiment.to_dict('dict')
sentiment_dict_new = {k: {m.strftime('%Y-%m-%d %H:%M:%S'): v for m, v in v.items()} for k, v in sentiment_dict.items()}

sentiment_dic_now 的输出是:

{'Negatif ': {'2019-08-27 00:00:00': 5.0, '2019-08-28 00:00:00': 2.0, '2019-08-29 00:00:00': 3.0}, 'Netral ': {'2019-08-27 00:00:00': 4.0, '2019-08-28 00:00:00': 1.0, '2019-08-29 00:00:00': 4.0}, 'Positif ': {'2019-08-27 00:00:00': nan, '2019-08-28 00:00:00': nan, '2019-08-29 00:00:00': 1.0}}

我想将 nan 转换为 0,所以我尝试使用以下代码:

sentiment_dict_new = sentiment_dict_new.fillna(0)

但是我得到了这个错误:

AttributeError: 'dict' object has no attribute 'fillna'

nan values 不等于它自己,所以你可以这样做:

sentiment_dict_new = {k: {m.strftime('%Y-%m-%d %H:%M:%S'): v if v == v else 0 for m, v in v.items()} for k, v in sentiment_dict.items()}
for obj in sentiment_dict_new:
  for key in obj:
    if obj[key] != obj[key]: obj[key] = 0

您可以使用 math.isnannumpy.isnan 检查浮点数是否为 NaN(不是数字)。遍历字典中的所有键值对允许您用 0 替换所有 NaN 的情况。

import math
for key in sentiment_dict_new.keys():
    for second_key in key.keys():
        if math.isnan(sentiment_dict_new[key][second_key]):
            sentiment_dict_new[key][second_key] = 0

math 具有检测 NaN 值的内置函数。然后,您可以轻松定义一个可以执行此操作的辅助函数:

import math

def fillna(value, default=0):
    if math.isnan(value):
        return default
    return value

你的新字典可以是:

sentiment_dict_new = {k: 
    {ki.strftime('%Y-%m-%d %H:%M:%S'): fillna(vi) for ki, vi in v.items()} 
    for k, v in sentiment_dict.items()
}