Python Forum
Removing nan values from a dict
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Removing nan values from a dict
#1
I have this dict:
Output:
[438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004, nan, nan, nan, nan]
Please how can I remove the nan values?
I have used
my_dict.pop(nan)
but it doesn't work since nan is not a string
Reply
#2
nan = 0
mylist = [438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004, nan, nan, nan, nan]

for i in range(len(mylist)):
    if i >= 6:
        mylist.pop()

print(mylist)
Output:
[438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004]
tomtom likes this post
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#3
The object you show isn't a dict, but a list.

When you use list.pop(), you feed it the location of the item to be removed, not the value of the item. Removing items that will fail direct matches is a bit tricky. You could use a comprehension to make a copy of the list with just the non-nan values.

>>> l
[438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08, nan, nan, nan, nan]
>>> import math
>>> newlist = [x for x in l if not math.isnan(x)]
>>> newlist
[438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08]
tomtom likes this post
Reply
#4
You should tell where the list come from(not a dict) as it has nan lowercase it most likely come from NumPy.
When use eg NumPy, Pandas the way to solve can be very different from doing it in stander Python.

nan will give a error so menator01 has solved it by using nan = 0,not ideal but that because of lacking information from OP as mention.
So it can be done like this.
# Give error
>>> lst = [438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004, nan, nan, nan, nan]
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
NameError: name 'nan' is not defined

>>> import numpy as np
>>> from numpy import nan # Fix error
>>>
>>> lst = [438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004, nan, nan, nan, nan]
>>> [x for x in lst if ~np.isnan(x)]
[438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004]
tomtom likes this post
Reply
#5
Assuming it is a numpy array.
import numpy as np

notadict = np.array([438.4, 439.18, 439.9, np.nan, np.nan])
print(notadict[(~np.isnan(notadict))], notadict)
print(np.delete(notadict, np.isnan(notadict)), notadict)
print(np.nan_to_num(notadict, nan=0.0), notadict)
print(np.nan_to_num(notadict, copy=False, nan=0.0), notadict)
Output:
[438.4 439.18 439.9 ] [438.4 439.18 439.9 nan nan] [438.4 439.18 439.9 ] [438.4 439.18 439.9 nan nan] [438.4 439.18 439.9 0. 0. ] [438.4 439.18 439.9 nan nan] [438.4 439.18 439.9 0. 0. ] [438.4 439.18 439.9 0. 0. ]
Notice that nan_to_num does the change in place if you use "copy=False".
tomtom likes this post
Reply
#6
(Oct-05-2021, 03:33 PM)menator01 Wrote:
nan = 0
mylist = [438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004, nan, nan, nan, nan]

for i in range(len(mylist)):
    if i >= 6:
        mylist.pop()

print(mylist)
Output:
[438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004]
Thank you so much sir, but the len of the list is not fixed it will be determine by the bars the traded cryptocurrency
Reply
#7
(Oct-05-2021, 02:57 PM)tomtom Wrote: I have this dict:
Output:
[438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004, nan, nan, nan, nan]
Please how can I remove the nan values?
I have used
my_dict.pop(nan)
but it doesn't work since nan is not a string

list not a dict
Reply
#8
(Oct-05-2021, 06:20 PM)tomtom Wrote:
(Oct-05-2021, 03:33 PM)menator01 Wrote:
nan = 0
mylist = [438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004, nan, nan, nan, nan]

for i in range(len(mylist)):
    if i >= 6:
        mylist.pop()

print(mylist)
Output:
[438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004]
Thank you so much sir, but the len of the list is not fixed it will be determine by the bars the traded cryptocurrency


This will not matter the list length. You should use one of the more experienced programmers suggestions though.

#! /usr/bin/env python3

nan = 0
mylist = [438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08000000000004, nan, nan, nan, nan]

for i in range(len(mylist)):
    if 0 in mylist:
        mylist.pop()

print(mylist)
tomtom likes this post
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#9
(Oct-05-2021, 03:39 PM)bowlofred Wrote: The object you show isn't a dict, but a list.

When you use list.pop(), you feed it the location of the item to be removed, not the value of the item. Removing items that will fail direct matches is a bit tricky. You could use a comprehension to make a copy of the list with just the non-nan values.

>>> l
[438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08, nan, nan, nan, nan]
>>> import math
>>> newlist = [x for x in l if not math.isnan(x)]
>>> newlist
[438.4, 439.18, 439.9, 440.21999999999997, 440.38, 441.08]

I used this and it worked fine, thank you sir
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  dict class override: how access parent values? Andrey 1 1,617 Mar-06-2022, 10:49 PM
Last Post: deanhystad
  Trouble with converting list , dict to int values! faryad13 7 3,729 Sep-04-2020, 06:25 AM
Last Post: faryad13
  Sort a dict in dict cherry_cherry 4 72,555 Apr-08-2020, 12:25 PM
Last Post: perfringo
  How to access specific values from a dict? t4keheart 6 3,084 Feb-05-2020, 11:34 PM
Last Post: metulburr
  updating certain values in dict. with relation to their keys malevy 17 5,302 Nov-27-2019, 02:37 PM
Last Post: buran
  update dict as per range of values anna 7 3,003 Sep-13-2019, 04:37 PM
Last Post: anna
  match values against keys three dict anna 0 2,104 Feb-21-2019, 05:30 PM
Last Post: anna
  Compare Two Values in the Same Dict malonn 6 4,398 Aug-01-2018, 03:54 PM
Last Post: malonn
  sorting nested dict according to values merlem 6 17,574 Apr-01-2017, 10:01 PM
Last Post: snippsat

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020