Pandas – MultiIndex-Objekte

Pandas – MultiIndex-Objekte

image_pdfimage_print

 

 







In [1]:
import pandas as pd
import numpy as np

eine mangelhafte Methode

In [2]:
index = [('California',2000),('California',2010),('New York',2000),('New York', 2010),
                ('Texas',2000),('Texas',2010)]
In [3]:
populations = [33871648,37253956,
             18976457,19378102,
             20851820,25145561]
In [4]:
pop = pd.Series(populations,index = index)
In [5]:
pop
Out[5]:
(California, 2000)    33871648
(California, 2010)    37253956
(New York, 2000)      18976457
(New York, 2010)      19378102
(Texas, 2000)         20851820
(Texas, 2010)         25145561
dtype: int64
In [6]:
# bei dieser Art Indexverfahren ist Indizierung oder Slicing mit mehreren Indizes möglich
pop[('California',2010):('Texas',2000)]
Out[6]:
(California, 2010)    37253956
(New York, 2000)      18976457
(New York, 2010)      19378102
(Texas, 2000)         20851820
dtype: int64
In [7]:
# wenn man aber zb. alle Werte aus dem Jahr 2010 auswählen möchte, ist es ziemlich kompliziert (und zudem langsam - 
# bei großen Datenmengen nicht effizient)
pop[[i for i in pop.index if i[1] == 2010]]
Out[7]:
(California, 2010)    37253956
(New York, 2010)      19378102
(Texas, 2010)         25145561
dtype: int64

eine bessere Methode:MultiIndex in pandas

In [8]:
index = pd.MultiIndex.from_tuples(index)
index
Out[8]:
MultiIndex(levels=[['California', 'New York', 'Texas'], [2000, 2010]],
           labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])
In [9]:
pop = pop.reindex(index)
pop
Out[9]:
California  2000    33871648
            2010    37253956
New York    2000    18976457
            2010    19378102
Texas       2000    20851820
            2010    25145561
dtype: int64
In [10]:
pop['California',2010]
Out[10]:
37253956
In [11]:
pop[:2010]
Out[11]:
California  2000    33871648
            2010    37253956
New York    2000    18976457
            2010    19378102
Texas       2000    20851820
            2010    25145561
dtype: int64

mit unstack MultiIndex in ein DataFrame umwandeln

In [12]:
pop_df = pop.unstack()
pop_df
Out[12]:
2000 2010
California 33871648 37253956
New York 18976457 19378102
Texas 20851820 25145561

stack() Konvertierung in umgekehrter Richtung

In [13]:
pop_df.stack()
Out[13]:
California  2000    33871648
            2010    37253956
New York    2000    18976457
            2010    19378102
Texas       2000    20851820
            2010    25145561
dtype: int64
In [14]:
pop_df = pd.DataFrame({'total': pop,
                     'under18': [9267089,9284094,
                                4687374,4318033,
                                5906301,6879016]})
pop_df
Out[14]:
total under18
California 2000 33871648 9267089
2010 37253956 9284094
New York 2000 18976457 4687374
2010 19378102 4318033
Texas 2000 20851820 5906301
2010 25145561 6879016
In [15]:
### berechnung des antiel der unter 18 jährigen
In [16]:
f_u18 = pop_df['under18'] / pop_df['total']
f_u18
Out[16]:
California  2000    0.273594
            2010    0.249211
New York    2000    0.247010
            2010    0.222831
Texas       2000    0.283251
            2010    0.273568
dtype: float64
In [17]:
f_u18.unstack()
Out[17]:
2000 2010
California 0.273594 0.249211
New York 0.247010 0.222831
Texas 0.283251 0.273568

 

 


Die Kommentare sind geschloßen.