efficient way to fill a series of zeros with values at specific positions

Question:

I would like to find an efficient way to fill a series of zeros with values at specific positions, based on the index. Here is some exemplary code:

import pandas as pd

dict_0 = {x: 0 for x in range(1, 11)}
ser_0 = pd.Series(dict_0)

dict_vals={2:0.1, 5:0.9}
ser_vals=pd.Series(dict_vals) 

ser_composed = pd.concat([ser_0[~ser_0.index.isin(ser_vals.index)],
ser_vals[ser_vals.index.isin(ser_vals.index)]])
ser_composed.sort_index()

As I want to apply it to much data, I’d like to find a way to do it more efficiently.
Can anyone help me?
Thanks a lot in advance!

Asked By: Jawis

||

Answers:

pd.Series.update is exactly what you’re looking for.

Note: It always modifies the Series in place. If you don’t want this, make a copy beforehand.

ser_0_original = ser_0.copy()

ser_0.update(ser_vals)
Answered By: Vladimir Fokow

Just in case you’re creating a dataframe with zeros first to be filled afterwards, consider directly creating the series based on dict_vals, along the lines of

pd.Series(dict_vals, index=range(1,11)).fillna(0)
Answered By: fsimonjetz

You can also use broadcasting

ser_0[dict_vals.keys()] = list(dict_vals.values())

This will modify ser_0, if you want to preserve it use a copy

ser_composed = ser_0.copy()
ser_composed[dict_vals.keys()] = list(dict_vals.values())

Output

1     0.0
2     0.1
3     0.0
4     0.0
5     0.9
6     0.0
7     0.0
8     0.0
9     0.0
10    0.0
Answered By: Guy
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.