2013-08-28 149 views
2

我试图拿出一个数据帧做一些数据分析和真的会从具有数据帧,可以在一个数据帧处理常规的索引和MultiIndexing一起受益。结合多指标和指数的大熊猫数据帧

对于每位患者,我有各种类型的数据(T1avg,T2avg,等...)的6片。让我们称此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声誉这么做]

理想情况下,我想有一个数据帧(如下所示)(勾勒出来的图像编辑器抱歉)

所需输出的图像:df-desired

但是当我尝试使用附加命令,

com = df.append(df2) 

我得到不需要的东西,多指标的,我在DF成立,现在走了,带着类型元组的简单指数(“NecS3Hs05,片0”等)所取代。来自df2的指数保持不变'NecS3Hs05'。

这是可以做到与熊猫,还是我在这里找错了树?此外,这甚至是推荐的将数据框中的患者属性存储起来的方法(即这是否为未解决的问题)?我认为我真正想要的是将所有内容都保存在一个简单的索引中,而是将N-d数组存储在数据框的元素中。

举例来说,如果我尝试类似:

com['NecS3Hs05','T1avg'] 

我想要得到的形状/数组/元组len个6

,当我试图让肿瘤类型:

com['NecS3Hs05','Tumour Type'] 

我得到的字符串“皮下”。很明显,我也想保留数据帧的酷炫功能,看起来PANDAS是正确的方式,我只需要更多地了解如何设置我的数据帧

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

+0

附: (['NecS3Hs05'] * 6)填写条目并设置MultiIndex这种方式感觉'错误',没有人有更好的方法吗? – Firas

+0

我只是使用一个常规的DataFrame与肿瘤等信息复制多行。 – BrenBarn

+0

@BrenBarn我相信这就是OP在df-desired中所指示的 – DrSAR

回答

1

你的问题是可以解决的,我相信,如果你删除了多指标的企业。设想'''df'''只有(非唯一)'Patient'作为索引。 '切片'将成为一个简单的专栏。

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'] 

会给你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 
+0

我曾想过这个,但作为最后的手段。几个原因:1)数据被不必要地复制我知道足迹很小,但仍然看起来很浪费,以这种方式组织我的数据。 2)如果我想在数据框中保留唯一的东西,那么这是患者信息,因此稍后可以轻松操作以获得所有患有原位对照肿瘤的患者,这些患者进行了2次成像会话(这样,是一个额外的操作来获取独特的条目 – Firas

+1

3)当在Wes的视频和文档http://pandas.pydata.org/pandas-docs/stable/indexing.html#hierarchical中描述时,MultiIndexing看起来很酷-indexing,多指标。尽管如果没有其他建议,我很乐意使用这种方法! – Firas

+2

恕我直言'MultiIndex'应该避免,除非没有办法绕过它。您可以使用'stack' /'unstack' /'reset_index' /'melt'的一些组合将'MultiIndex'轻松移动到列。如果你的索引级别是你的'DataFrame'中的列,查询将会更快并且*更容易*。 –