2013-04-18 4 views
23

멀티 인덱스 열 데이터 프레임의 두 번째 수준에 열을 추가하고 싶습니다.팬더 : 멀티 인덱스 열 데이터 프레임에 열 추가

In [151]: df 
Out[151]: 
first  bar     baz   
second  one  two  one  two 
A  0.487880 -0.487661 -1.030176 0.100813 
B  0.267913 1.918923 0.132791 0.178503 
C  1.550526 -0.312235 -1.177689 -0.081596 

직접 할당의 일반적인 트릭은 작동하지 않습니다

In [152]: df['bar']['three'] = [0, 1, 2] 

In [153]: df 
Out[153]: 
first  bar     baz   
second  one  two  one  two 
A  0.487880 -0.487661 -1.030176 0.100813 
B  0.267913 1.918923 0.132791 0.178503 
C  1.550526 -0.312235 -1.177689 -0.081596 

어떻게 "바"아래에 세 번째 행을 추가 할 수 있습니까? 그것은 실제로 매우 간단

답변

40

(FWIW, 내가 원래 생각은 그것에게 당신의 방법을 수행하는) :

df['bar', 'three'] = [0, 1, 2] 
df = df.sort_index(axis=1) 
print(df) 

     bar      baz   
     one  two three  one  two 
A -0.212901 0.503615  0 -1.660945 0.446778 
B -0.803926 -0.417570  1 -0.336827 0.989343 
C 3.400885 -0.214245  2 0.895745 1.011671 
+0

감사 : 세 가지 "하위 열"과 멀티 레벨 열을 추가. sort_index를 사용한 후에 만 ​​새로운 열이 나타나는 이유는 분명하지 않습니다. – ezbentley

+2

오, 그게 유감 스럽지만 대답의 일부가 아니에요. 'df [ 'bar', 'three'] = [0, 1, 2]'를 호출하자 마자 실제로 표시됩니다. 기본적으로 팬더는 ([baz, two] 다음에) DataFrame의 끝에 넣을 것입니다. 나는 단지 다른 'bar'와 그것을보고 싶었습니다. – spencerlyon2

+0

나는 본다. 설명 해줘서 고마워. – ezbentley

1

우리는 다단계 열을 추가하려면 :

소스 DF :

In [221]: df 
Out[221]: 
first  bar     baz 
second  one  two  one  two 
A  -1.089798 2.053026 0.470218 1.440740 
B  0.488875 0.428836 1.413451 -0.683677 
C  -0.243064 -0.069446 -0.911166 0.478370 

옵션 1 : 나누기 결과 : bar/baz을 새 foo

01 23,516,
In [222]: df = df.join(df[['bar']].div(df['baz']).rename(columns={'bar':'foo'})) 

In [223]: df 
Out[223]: 
first  bar     baz     foo 
second  one  two  one  two  one  two 
A  -1.089798 2.053026 0.470218 1.440740 -2.317647 1.424980 
B  0.488875 0.428836 1.413451 -0.683677 0.345873 -0.627250 
C  -0.243064 -0.069446 -0.911166 0.478370 0.266761 -0.145172 

옵션 2 :

In [235]: df = df.join(pd.DataFrame(np.random.rand(3,3), 
    ...:       columns=pd.MultiIndex.from_product([['new'], ['one','two','three']]), 
    ...:        index=df.index)) 

In [236]: df 
Out[236]: 
first  bar     baz     new 
second  one  two  one  two  one  two  three 
A  -1.089798 2.053026 0.470218 1.440740 0.274291 0.636257 0.091048 
B  0.488875 0.428836 1.413451 -0.683677 0.668157 0.456931 0.227568 
C  -0.243064 -0.069446 -0.911166 0.478370 0.333824 0.363060 0.949672