如何将pandas透视表转换为datafram

2024-04-29 05:02:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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和患者计数数据是一个数据帧中的单独列,那么就很容易了。但我认为医院和地区是指标。我试过很多东西,但都没能成功。


Tags: 数据exampleh2h1h4h3h5r2
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'

您可以使用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']

这就可以做到:

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

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

相关问题 更多 >