我有一些代码:
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'
答案 0 :(得分:2)
您可以使用math.isnan
或numpy.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