在PANDAS DataFrame中组合MultiIndex和Index

时间:2013-08-28 04:25:22

标签: python pandas

我正在尝试使用DataFrame进行一些数据分析,并且真正受益于拥有一个可以在一个数据帧中处理常规索引和MultiIndexing的数据帧。

对于每位患者,我有6片不同类型的数据(T1avg,T2avg等...)。让我们调用这个dataframe1(来自ipython笔记本):

import pandas
dat0 = numpy.zeros([6])
dat1 = numpy.zeros([6])
pat0=(['NecS3Hs05']*6)
pat1=(['NecS3Hs06']*6)

slc = (['Slice ' + str(x) for x in xrange(dat0.shape[-1])])

ind = zip(*[pat0+pat1,slc+slc])

named_ind = pandas.MultiIndex.from_tuples(ind, names = ['Patients','Slices'])
ser = pandas.Series(numpy.append(dat0,dat1),index = named_ind)
df = pandas.DataFrame(data=ser, columns=['T1avg'])

输出图片:df1

对于每位患者,我也有各种信息(肿瘤类型,成像次数,治疗类型):

pats = ['NecS3Hs05','NecS3Hs05']
tx = ['Control','Treated']
Ttype = ['subcutaneous','orthotopic']
NSessions = ['2','3']

cols = ['Tx Group', 'Tumour Type', 'Imaging Sessions']
dat = numpy.array([tx,Ttype,NSessions]).T

df2 = pandas.DataFrame(dat, index=pats,columns=cols)

[我也想在这里发布一张图片,但我至少需要10个声望才能这样做]

理想情况下,我想要一个看起来如下的数据框(在图像编辑器中勾勒出来)#/ p>

所需输出的图像:df-desired

但是当我尝试使用append命令时,

com = df.append(df2)

我得到了一些不受欢迎的东西,我在df中设置的MultiIndex现在已经消失了,取而代之的是一个类型为元组的简单索引('NecS3Hs05,Slice 0'等......)。来自df2的指数保持不变'NecS3Hs05'。

这可能与PANDAS有关,还是我在这里咆哮错误的树?此外,这甚至是一种在数据框中存储患者属性的推荐方法(即这是不可取的)?我认为我真正想要的是保持一切简单的索引,而是将N-d数组存储在数据框的元素中。

例如,如果我尝试这样的话:

 com['NecS3Hs05','T1avg']

我想得到一个shape / len 6的数组/元组

当我试图获得肿瘤类型时:

com['NecS3Hs05','Tumour Type']

我得到了'皮下'字符串。显然我也希望保留数据帧的酷炫功能,看起来像PANDAS是正确的方式,我只需要了解如何设置我的数据帧

我希望这是一个明智的问题,如果没有,我很乐意重新组建它。

1 个答案:

答案 0 :(得分:1)

如果您放弃MultiIndex业务,我相信您的问题可以解决。想象一下''''df'''只有(非唯一的)'患者'作为索引。 'Slices'将成为一个简单的专栏。

ind = zip(*[pat0+pat1])
named_ind = pandas.MultiIndex.from_tuples(ind, names = ['Patients'])
df = pandas.DataFrame({'T1avg':ser})
df['Slice']=pandas.Series(numpy.append(slc, slc), index=df.index)

如果你必须在切片上选择,你仍然可以这样做:

df[df['Slice']=='Slice 4']

将为所有患者提供Slice 4。请注意,这样就不需要为所有患者提供该行。

只要您的新数据框(df2)定义了相同的索引,您就可以非常简单地加入该索引:

df.join(df2)

你会得到

               T1avg    Slice Tx Group   Tumour Type Imaging Sessions
Patients                                                         
NecS3Hs05      0  Slice 0  Control  subcutaneous                2
NecS3Hs05      0  Slice 1  Control  subcutaneous                2
NecS3Hs05      0  Slice 2  Control  subcutaneous                2
NecS3Hs05      0  Slice 3  Control  subcutaneous                2
NecS3Hs05      0  Slice 4  Control  subcutaneous                2
NecS3Hs05      0  Slice 5  Control  subcutaneous                2
NecS3Hs06      0  Slice 0  Treated    orthotopic                3
NecS3Hs06      0  Slice 1  Treated    orthotopic                3
NecS3Hs06      0  Slice 2  Treated    orthotopic                3
NecS3Hs06      0  Slice 3  Treated    orthotopic                3
NecS3Hs06      0  Slice 4  Treated    orthotopic                3
NecS3Hs06      0  Slice 5  Treated    orthotopic                3