【问题标题】:Is there a way to remove nan from a dictionary filled with data?有没有办法从充满数据的字典中删除 nan ?
【发布时间】:2014-07-26 22:12:48
【问题描述】:

我有一个字典,其中包含来自我导入的两个文件的数据,但其中一些数据以 nan 形式出现。如何使用 nan 删除数据片段?

我的代码是:

import matplotlib.pyplot as plt 
from pandas.lib import Timestamp
import numpy as np   
from datetime import datetime
import pandas as pd
import collections

orangebook = pd.read_csv('C:\Users\WEGWEIS_JAKE\Desktop\Work Programs\Code Files\products2.txt',sep='~', parse_dates=['Approval_Date'])
specificdrugs=pd.read_csv('C:\Users\WEGWEIS_JAKE\Desktop\Work Programs\Code Files\Drugs.txt',sep=',')

"""This is a dictionary that collects data from the .txt file
This dictionary has a key,value pair for every generic name with its corresponding approval date """
drugdict={}
for d in specificdrugs['Generic Name']:
    drugdict.dropna()
    drugdict[d]=orangebook[orangebook.Ingredient==d.upper()]['Approval_Date'].min()

我应该在这段代码中添加或删除什么以确保字典中没有值为 nan 的键值对?

【问题讨论】:

  • 您可以将filter() 与字典理解一起使用。请参阅此内容以供参考:stackoverflow.com/a/16589453/758446
  • 你的 nan 是作为键还是值存储在字典中?

标签: python dictionary nan


【解决方案1】:

与其尝试从字典中删除 NaN,不如进一步调查为什么 NaN 会首先出现。

在字典中使用 NaN 变得很困难,因为 NaN 不等于自身。

查看此内容了解更多信息:NaNs as key in dictionaries

【讨论】:

    【解决方案2】:
    from math import isnan
    

    如果 nans 被存储为键:

    # functional
    clean_dict = filter(lambda k: not isnan(k), my_dict)
    
    # dict comprehension
    clean_dict = {k: my_dict[k] for k in my_dict if not isnan(k)}
    

    如果 nans 被存储为值:

    # functional
    clean_dict = filter(lambda k: not isnan(my_dict[k]), my_dict)
    
    # dict comprehension
    clean_dict = {k: my_dict[k] for k in my_dict if not isnan(my_dict[k])}
    

    【讨论】:

    • 这对我来说不起作用,因为键不是数字...如果它对任何人都有帮助,对于字符串我将其更改为:c = {k: c[k] for k in c 如果 type(k) 是 str}
    • 你也可以遍历.items():{k: v for k, v in my_dict.items() if not isnan(v)}
    【解决方案3】:

    使用简单的json

    import simplejson
    
    clean_dict  = simplejson.loads(simplejson.dumps(my_dict, ignore_nan=True))
    ## or depending on your needs
    clean_dict  = simplejson.loads(simplejson.dumps(my_dict, allow_nan=False))
    

    【讨论】:

    • 我仍然得到 None 作为值
    【解决方案4】:

    知道旧的,但这是对我有用且简单的方法 - 在预先读取 CSV 时删除 NaN:

    orangebook = pd.read_csv('C:\Users\WEGWEIS_JAKE\Desktop\Work Programs\Code Files\products2.txt',sep='~', parse_dates=['Approval_Date']).dropna()
    

    我也喜欢同时转换成字典:

    orangebook = pd.read_csv('C:\Users\WEGWEIS_JAKE\Desktop\Work Programs\Code Files\products2.txt',sep='~', parse_dates=['Approval_Date']).dropna().to_dict()
    

    【讨论】:

    • 使用 .dropna() 删除整列和空值的行
    猜你喜欢
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多