Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pandas: expand index of a series so it contains all values in a range

Tags:

python

pandas

I have a pandas series that looks like this:

>>> x.sort_index()
2       1
5       2
6       3
8       4

I want to fill out this series so that the "missing" index rows are represented, filling in the data values with a 0.

So that when I list the new series, it looks like this:

>>> z.sort_index()
1       0
2       1
3       0
4       0
5       2
6       3
7       0
8       4

I have tried creating a "dummy" Series

>>> y = pd.Series([0 for i in range(0,8)])
0    0
1    0
2    0
3    0
4    0
5    0
6    0
7    0

And then concat'ing them together - but the results are either:

>>> pd.concat([x,z],axis=0)
2    1
5    2
6    3
8    4
0    0
1    0
2    0
3    0
4    0
5    0
6    0
7    0

Or

>>> pd.concat([x,z],axis=1)
    0   1
0 NaN   0
1 NaN   0
2   1   0
3 NaN   0
4 NaN   0
5   2   0
6   3   0
7 NaN   0
8   4 NaN

Neither of which is my target structure listed above.

I could try performing some arithmetic on the axis=1 version, and taking a sum of columns 1 and 2, but am looking for a neater, one-line version of this - does such an index filling/cleansing operation exist, and if so, what is it?

like image 695
Thomas Kimber Avatar asked Oct 30 '14 12:10

Thomas Kimber


1 Answers

What you want is a reindex. First create the index as you want (in this case just a range), and then reindex with it:

In [64]: x = pd.Series([1,2,3,4], index=[2,5,6,8])

In [65]: x
Out[65]:
2    1
5    2
6    3
8    4
dtype: int64

In [66]: x.reindex(range(9), fill_value=0)
Out[66]:
0    0
1    0
2    1
3    0
4    0
5    2
6    3
7    0
8    4
dtype: int64
like image 60
joris Avatar answered Oct 22 '22 04:10

joris