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

时间:2019-08-29 16:42:10

标签: python dictionary nan

我有一些代码:

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'

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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()
}

答案 2 :(得分:0)

nan值不等于其自身,因此您可以这样做:

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()}

答案 3 :(得分:0)

for obj in sentiment_dict_new:
  for key in obj:
    if obj[key] != obj[key]: obj[key] = 0