Python Forum

Full Version: Removing nan values from a dict
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
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
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]
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]
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]
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".
(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
(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
(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)
(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