How best to insert NaN values in a Python list by referring to an already sorted list
You could try something like this:
Sorted_List = [1,2,3,4]
Master_List =
[[1],
[1,2],
[1,4],
[3]]
Converted_Master_List = []
for part in Master_List:
new_part = [NaN] * len(Sorted_List)
for i in range(len(Sorted_List)):
if Sorted_List[i] in part:
new_part[i] = Sorted_List[i]
Converted_Master_List.append(new_part)
Can't append NaN to python list
In line 14 np=df1.to_numpy()
you reassigned variable np
from a package to a numpy array. So when you called np.nan
it was searching nan
from the numpy ndarray instance, not the package.
Change the variable to any other name and it will work fine.
How can i insert values from a list into a pandas data frame column?
You can use Numpy'ssearchsorted
.After you create a new_y
array that is the same length as the new_x
array. You use searchsorted
to identify where in the new_y
array you need to drop the old y
values.
new_y = np.full(len(new_x), np.nan, np.float64)
new_y[np.searchsorted(new_x, df.x)] = df.y
pd.DataFrame({'x': new_x, 'y': new_y})
x y
0 0.00 3.0
1 0.03 NaN
2 0.07 4.0
3 0.10 6.0
4 0.13 5.0
5 0.17 NaN
6 0.20 NaN
numpy.insert() invalid slice -- Trying to Insert NaN in Numpy Array
Your code is currently attempting to insert 0
at index np.nan
. Switch the args around:
a = np.insert(a, 0, np.nan)
Insert NaN if key is missing in dictionary
This task can be accomplished simply using the dict.get()
function. Documentation here.
Example:
empty = {'a':'', 'b':'', 'c':'', 'd':''}
filled = {'a':'1', 'c':'2'}
result = {k: filled.get(k, 'NaN') for k in empty}
Output:
{'a': '1', 'b': 'NaN', 'c': '2', 'd': 'NaN'}
Notes:
If you'd prefer the 'proper' nan
value, which is a float
data type and can be used in None
and isnull()
-like validation, replace the 'NaN'
with float('nan')
.
Inserting a value to list according to a threshold value
Here is the probable solution to the stated problem though the output is not matching with your desired outcome. But sharing on the basis of how I understood the problem.
a = [1, 2, 3, 6, 8, 12, 13, 18, 33, 23]
b = []
b.append(a[0])
threshold = 1 # Set Threshold value
for index in range(len(a)):
difference = 0
for i in range(len(b)):
difference = abs(a[index] - b[i])
if difference > threshold:
continue # Keep comparing other values in list b
else:
break # No need for further comparison
if difference > threshold:
b.append(a[index])
print("\nOutput list is")
print(b)
Output is:
Output list is
[1, 3, 6, 8, 12, 18, 33]
Also, I notice that after swapping the last two elements (33 <-> 23 ) of the list a as below:
a = [1, 2, 3, 6, 8, 12, 13, 18, 23, 33]
and running the same code. the output was near to your desired output:
Output list is
[1, 3, 6, 8, 12, 18, 23, 33]
This problem is very interesting now as I put myself into more investigation. And I found it a very interesting. Let me explain. First consider the list a as a list of integer numbers starting from 1 to N. For example:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
and set the threshold to 1
threshold = 1 # Set Threshold value
Now, run the programme with threshold = 1 and you will get the output:
Output list is
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
and if you rerun with threshold = 2, you will get the following output:
threshold = 2
Output list is
[1, 4, 7, 10, 13, 16, 19]
Basically, this programme is basically generating a hopping series of integer numbers where hopping is set to the threshold value.
Interesting!!! Isn't it???
How to account for ties in returning top n values?
def top_items(item_counts, n=3):
counts = Counter(item_counts)
top_n_values = set([x[1] for x in c.most_common(n)])
output = {k:v for k,v in d.items() if v in top_n_values}
return sorted(output, key=output.get, reverse=True)
d = {'aberdeen': 5,
'amsterdam': 6,
'amsterdam?fussa': 6,
'anchorage': 12,
'andalucia?granada': 5,
'ann arbor': 6,
'aral': 6,
'arlington': 6,
'asia?london': 6,}
top_items(d)
Output
['anchorage',
'amsterdam',
'amsterdam?fussa',
'ann arbor',
'aral',
'arlington',
'asia?london']
Append list in list of lists
Since you have only one missing value at once, this should work:
lst=[[0, 0.05],
[1, 0.02],
[3, 0.02],
[5, 0.01]]
finlst = [lst[0]]
for ll in lst[1:]:
lind = finlst[-1][0]
if ll[0] - lind == 1:
finlst.append(ll)
else:
finlst.extend([[lind+1, ll[1]/2], [lind+2, ll[1]/2]])
finlst
is: [[0, 0.05], [1, 0.02], [2, 0.01], [3, 0.01], [4, 0.005], [5, 0.005]]
.
And since we are here, I propose a more general solution working also in case where there is more than one missing value.
finlst = [lst[0]]
for ll in lst[1:]:
lastind = finlst[-1][0]
toadd = ll[0] - lastind
for i in range(toadd):
finlst.append([lastind+i+1, ll[1]/toadd])
Related Topics
How to Divide Each Column of Pandas Dataframe by a Series
Python Format Size Application (Converting B to Kb, Mb, Gb, Tb)
How to Verify If a Button Is Enabled and Disabled in Webdriver Python
Replacing Blank Values (White Space) With Nan in Pandas
How to Remove Parentheses from a String
How to Remove Square Brackets from List in Python
How to Remove Strings Present in a List from a Column in Pandas
How to Clear Only Last One Line in Python Output Console
Removing Backslashes from a String in Python
How to Limit the User Input to Only Integers in Python
How to Kill a While Loop With a Keystroke
In Python, How to Split a String and Keep the Separators
Removing Rows and Columns in Python CSV Module
Find Value in Dictionary Using Regex in Python