如何在字典中将 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.isnan
或 numpy.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()
}
我有一些代码:
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.isnan
或 numpy.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()
}