如何将pandas数据透视表转换为数据帧

时间:2014-03-31 23:52:25

标签: python pandas pivot-table

我想使用数据透视表来汇总数据集,然后能够访问数据透视表中的信息,就像它是一个DataFrame一样。

考虑一个分层数据集,其中患者在医院和位于地区的医院接受治疗:

import pandas as pd

example_data = {'patient' : ['p1','p2','p3','p4','p5','p6','p7','p8','p9','p10','p11','p12','p13','p14','p15','p16','p17','p18','p19','p20','p21','p22','p23','p24','p25','p26','p27','p28','p29','p30','p31','p32','p33','p34','p35','p36','p37','p38','p39','p40','p41','p42','p43','p44','p45','p46','p47','p48','p49','p50','p51','p52','p53','p54','p55','p56','p57','p58','p59','p60','p61','p62','p63'], 
                'hospital' : ['h1','h1','h1','h2','h2','h2','h2','h3','h3','h3','h3','h3','h4','h4','h4','h4','h4','h4','h5','h5','h5','h5','h5','h5','h5','h6','h6','h6','h6','h6','h6','h6','h6','h7','h7','h7','h7','h7','h7','h7','h7','h7','h8','h8','h8','h8','h8','h8','h8','h8','h8','h8','h9','h9','h9','h9','h9','h9','h9','h9','h9','h9','h9'], 
                'region' : ['r1','r1','r1','r1','r1','r1','r1','r1','r1','r1','r1','r1','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3'] }

example_dataframe = pd.DataFrame(example_data)

print example_dataframe

这产生如下的简单输出:

   hospital patient region
0        h1      p1     r1
1        h1      p2     r1
2        h1      p3     r1
3        h2      p4     r1
4        h2      p5     r1
5        h2      p6     r1
6        h2      p7     r1
7        h3      p8     r1
8        h3      p9     r1
9        h3     p10     r1
10       h3     p11     r1
11       h3     p12     r1
12       h4     p13     r2
13       h4     p14     r2
14       h4     p15     r2
15       h4     p16     r2
16       h4     p17     r2
etc.

现在我想总结使用数据透视表,只计算每家医院的患者人数:

example_pivot_table = pd.pivot_table(example_dataframe, values='patient', rows=['hospital','region'], aggfunc='count')

print example_pivot_table

这会产生以下输出:

hospital  region
h1        r1         3
h2        r1         4
h3        r1         5
h4        r2         6
h5        r2         7
h6        r2         8
h7        r3         9
h8        r3        10
h9        r3        11
Name: patient, dtype: int64

据我了解,这实际上是一个多索引系列。

如何使用此数据查明医院h7所在的区域?如果hospitalregion和患者计数数据是DataFrame中的单独列,则很容易。但我认为医院和地区是指数。我已经尝试过很多东西,但却无法让它发挥作用。

3 个答案:

答案 0 :(得分:3)

您可以使用get_level_values获取医院专栏。您可以传递级别数或级别名称,即0hospital

然后你可以得到你想要的东西:

In [38]: example_pivot_table[ example_pivot_table.index.get_level_values('hospital') == 'h7' ]
Out[38]: 
hospital  region
h7        r3        9
Name: patient, dtype: int64

更新

要获取区域,您可以

example_pivot_table[ example_pivot_table.index.get_level_values('hospital') == 'h7' ]['regions']

答案 1 :(得分:3)

首先,这不是一个数据透视表工作,它是一个groupby工作。

数据透视表用于在您没有设置索引时重新设置数据(请参阅this doc article),stackunstack用于重新设置 设置索引,groupby用于聚合(这就是这个)和split-apply-combine操作。

以下是如何使用groupby来确定您的患者数量:

>>> patient_count = df.groupby(['hospital', 'region']).count()
>>> print patient_count
                 patient
hospital region         
h1       r1            3
h2       r1            4
h3       r1            5
h4       r2            6
h5       r2            7
h6       r2            8
h7       r3            9
h8       r3           10
h9       r3           11

要选择多索引中的某些行,我通常使用ix,如下所示:

>>> h7 = patient_count.ix['h7']
>>> print h7
        patient
region         
r3            9

现在您可以使用get_level_values

>>> h7.index.values[0]
'r3'

或者,如果您不想要多索引版本(并且,为了您的目的,您可能不会),您可以这样做:

>>> patient_count = patient_count.reset_index()

您可以通过以下方式查找医院h7所在的地区:

>>> patient_count.region[patient_count.hospital == 'h7']
6    r3
Name: region, dtype: object

如果你只想要r3,你可以这样做:

>>> patient_count.region[patient_count.hospital == 'h7'].values[0]
'r3'

请注意,reset_index并非就地发生,因此非常适合链接此类方法:

>>> patient_count.ix['h7'].reset_index().region[0]
'r3'

答案 2 :(得分:1)

这样可以解决问题:

levels = example_pivot_table.columns.levels
labels = example_pivot_table.columns.labels
example_pivot_table.columns = levels[1][labels[1]]
example_pivot_table.reset_index(inplace=True)
example_pivot_table

因此,找到数据透视表中的级别和标签,为其分配列名和重置索引。最终结果应该是数据透视的结果数据框。