2013-08-28 2 views
2

일부 데이터 분석을 위해 DataFrame을 제안하려고하고 있으며, 하나의 데이터 프레임에서 일반 인덱스와 다중 인덱스를 함께 처리 할 수있는 데이터 프레임을 얻는 것이 실제로 도움이됩니다.PANDAS DataFrame에서 다중 인덱스와 인덱스 결합하기

각 환자마다 다양한 유형의 데이터 (T1avg, T2avg 등)가 6 개 있습니다. 의는 (AN ipython 노트북에서)이 dataframe1을 부르 자 : 출력의

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 평판 필요] 이상적으로

을, 내가 원하는 다음과 같이 보이는 dataframe을 원하는 출력의

이미지 (이미지 죄송 편집기에서 밖으로 스케치) : df-desired

하지만

com = df.append(df2) 

내가 얻을의 append 명령을 사용하려고 할 때 뭔가 원하지 않는 점은, df에서 설정 한 MultiIndex가 사라지고 형식 튜플 ('NecS3Hs05, Slice 0'등 ...)의 간단한 인덱스로 대체되었습니다. df2의 색인은 'NecS3Hs05'와 동일합니다.

PANDAS와 (과) 가능한가요 아니면 내가 여기 잘못된 나무를 짖고 있습니까? 또한, 데이터 프레임에 Patient 속성을 저장하는 것이 좋습니다 (즉,이 unpandas입니까?). 모든 것을 단순한 인덱스로 유지하는 대신 데이터 프레임의 요소 안에 N-d 어레이를 저장하는 것이 좋을 것이라고 생각합니다. 내가 좋아하는 뭔가를 시도하는 경우 예를 들어

:

:

com['NecS3Hs05','T1avg'] 

을 나는 6

를 렌 모양의 배열/튜플/싶어 난 종양의 유형을 얻을 때

com['NecS3Hs05','Tumour Type'] 

'피하'문자열이 표시됩니다. 분명히 데이터 프레임의 멋진 기능을 유지하려고합니다. PANDAS가 올바른 방법 인 것처럼 보입니다. 데이터 프레임을 설정하는 방법에 대해 조금 더 이해해야합니다.

희망 사항이 있습니다. 현명한 질문, 그렇지 않다면, 나는 그것을 다시 형성하게되어 기쁠 것이다.

+0

P.S.를 얻을 수 있습니다 항목을 채우고 MultiIndex를이 방법으로 설정하려면 ([ 'NecS3Hs05'] * 6) '잘못된'느낌이 들지만 누구에게 더 좋은 방법이 있습니까? – Firas

+0

난 종양 등 정보가 여러 행에 걸쳐 복제 된 일반 DataFrame을 사용합니다. – BrenBarn

+0

@BrenBarn 나는 df-desired에서 OP가 나타내는 것을 믿습니다. – DrSAR

답변

1

MultiIndex 비즈니스를 삭제하면 문제가 해결 될 수 있습니다. 상상해보십시오. '' 'df' ''는 색인으로 '(고유하지 않은)'환자 '만 있습니다. '슬라이스'는 간단한 열이됩니다. 당신이 조각에 선택해야한다면

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를 줄 것이다. 이것이 어떻게 모든 환자에게 그 행을 줄 필요가 없는지 주목하십시오.

새 dataframe (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) MultiIndexing은 Wes 및 설명서 http://pandas.pydata.org/pandas-docs/stable/indexing.html#hierarchical의 비디오에 설명 된대로 멋지게 보입니다. -indexing-multiindex. 다른 제안이 없다면이 방법을 사용해도 행복합니다! – Firas

+2

IMHO'MultiIndex'는 주위에 방법이없는 한 피해야합니다. 'stack' /'unstack' /'reset_index' /'melt'의 조합을 사용하여'MultiIndex'를 열로 쉽게 옮길 수 있습니다. 인덱스 레벨이'DataFrame'의 컬럼 인 경우 쿼리는 더 빠르고 더 쉬워 질 것입니다. –

관련 문제