我正在尝试使用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是正确的方式,我只需要了解如何设置我的数据帧
我希望这是一个明智的问题,如果没有,我很乐意重新组建它。
答案 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