2016-10-14 5 views
1

4 개의 인덱스가 있습니다. Mun, loc, geo 및 block.멀티 인덱싱 및 로직 팬더가있는 마스크

     data1 data2 
mun loc geo block 
0 0 0 0  12  12 
1 0 0 0  20  20 
1 1 0 0  10  10 
1 1 1 0  10  10 
1 1 1 1  3  3/4 
1 1 1 2  4  4/4 
1 1 2 0  30  30 
1 1 2 1  1  1/3 
1 1 2 2  3  3/3 
1 1 0 0  4  4 
1 2 1 1  10  10/12 
1 2 1 2  12  12/12 
2 0 0 0  60  60 
2 1 1 1  123 123/123 
2 1 1 2  7  7/123 
2 1 2 1  6  6/6 
2 1 2 2  1  1/6 
     data1 data2 
mun loc geo block 
0 0 0 0  12  12 
1 0 0 0  20  20 
1 1 0 0  10  10 
1 1 1 0  10  10/30 
1 1 1 1  4  4 
1 1 2 0  30  30/30 
1 2 1 0  2  2/3 
1 2 2 0  3  3/3 
1 2 3 0  1  1/3 
2 0 0 0  60  60 
2 1 1 0  12  12/88 
2 1 1 1  1  1 
2 1 2 0  88  88/88 
2 1 2 1  9  9 
입니다
     data1 data2 
mun loc geo block 
0 0 0 0  14  14 
1 0 0 0  12  12 
1 1 0 0  20  20/20 
1 1 1 0  10  10 
1 1 1 1  31  31 
1 2 0 0  15  15/20 
1 2 1 1  11  11 
2 0 0 0  80  80 
2 1 0 0  100 100/100 
2 1 1 2  7  7 
2 2 0 0  11  11/100 

         data1 data2 
mun loc geo block 
0 0 0 0  55  55 
1 0 0 0  70  70/70 
1 1 0 0  12  12 
1 1 1 0  13  13 
2 0 0 0  60  60/70 
2 1 1 1  12  12 
2 1 2 1  6  6 
3 0 0 0  12  12/70 

, 내부 최대 값을 : 그리고 내가 마스크를 생성하고 다음과 같이 표시됩니다 작업을 수행 할 수 있습니다 그들과 함께 작동 마스크를 작성해야 계층 구조를 정의하고 각 요소를이 요소로 나눕니다. 첫 번째 문제와 관련하여 another question에 대한 도움을 받았지만 멀티 인덱스를 파악하는 데 많은 어려움을 겪고 있습니다. 어떤 도움을 주시면 감사하겠습니다.

+0

이것은 더 자세한 정보를 필요로한다. 분명히 최대 값을 통해 특정 요소를 나누는 반면 다른 요소는 그대로두고 선택 규칙을 설명하십시오. 데이터를 보는 것만으로는 분명하지 않습니다. – Khris

답변

2

쉽지 않았습니다.

수준 block :

print (df) 
        data1 data2 
mun loc geo block     
0 0 0 0   12  12 
1 0 0 0   20  20 
    1 0 0   10  10 
     1 0   10  10 
      1   3  3/4 
      2   4  4/4 
     2 0   30  30 
      1   1  1/3 
      2   3  3/3 
     0 0   4  4 
    2 1 1   10 10/12 
      2   12 12/12 
2 0 0 0   60  60 
    1 1 1  123 123/123 
      2   7 7/123 
     2 1   6  6/6 
      2   1  1/6 

mask3 = (df.index.get_level_values('mun') != 0) & \ 
     (df.index.get_level_values('loc') != 0) & \ 
     (df.index.get_level_values('geo') != 0) & \ 
     (df.index.get_level_values('block') != 0) 

print (mask3) 
[False False False False True True False True True False True True 
False True True True True] 

df2 = df.ix[mask3, 'data1'].groupby(level=['mun','loc','geo']).max() 
#print (df2) 

df2 = df2.reindex(df.reset_index(level=3, drop=True).index).mask(~mask3).fillna(1) 
#print (df2) 
print (df['data1'].div(df2.values,axis=0)) 
mun loc geo block 
0 0 0 0  12.000000 
1 0 0 0  20.000000 
    1 0 0  10.000000 
      1 0  10.000000 
       1   0.750000 
       2   1.000000 
      2 0  30.000000 
       1   0.333333 
       2   1.000000 
      0 0   4.000000 
    2 1 1   0.833333 
       2   1.000000 
2 0 0 0  60.000000 
    1 1 1   1.000000 
       2   0.056911 
      2 1   1.000000 
       2   0.166667 
dtype: float64 

수준 geo :

print (df) 
        data1 data2 
mun loc geo block    
0 0 0 0   12  12 
1 0 0 0   20  20 
    1 0 0   10  10 
     1 0   10 10/30 
      1   4  4 
     2 0   30 30/30 
    2 1 0   2 2/3 
     2 0   3 3/3 
     3 0   1 1/3 
2 0 0 0   60  60 
    1 1 0   12 12/88 
      1   1  1 
     2 0   88 88/88 
      1   9  9 

df1 = df.reset_index(drop=True, level='block') 

mask3 = (df.index.get_level_values('mun') != 0) & \ 
      (df.index.get_level_values('loc') != 0) & \ 
      (df.index.get_level_values('geo') != 0) & \ 
      (df.index.get_level_values('block') == 0) 

print (mask3) 
[False False False True False True True True True False True False 
    True False] 

df2 = df1.ix[mask3, 'data1'].groupby(level=['mun','loc']).max() 

df2=df2.reindex(df.reset_index(level=['geo','block'], drop=True).index).mask(~mask3).fillna(1) 
print (df2) 
df['new'] = df['data1'].div(df2.values,axis=0) 
그러나 주로 조건을 선택 값 get_level_values를 사용
print (df) 
        data1 data2  new 
mun loc geo block       
0 0 0 0   12  12 12.000000 
1 0 0 0   20  20 20.000000 
    1 0 0   10  10 10.000000 
     1 0   10 10/30 0.333333 
      1   4  4 4.000000 
     2 0   30 30/30 1.000000 
    2 1 0   2 2/3 0.666667 
     2 0   3 3/3 1.000000 
     3 0   1 1/3 0.333333 
2 0 0 0   60  60 60.000000 
    1 1 0   12 12/88 0.136364 
      1   1  1 1.000000 
     2 0   88 88/88 1.000000 
      1   9  9 9.000000 

수준 loc :

print (df) 
        data1 data2 
mun loc geo block     
0 0 0 0   14  14 
1 0 0 0   12  12 
    1 0 0   20 20/20 
     1 0   10  10 
      1   31  31 
    2 0 0   15 15/20 
     1 1   11  11 
2 0 0 0   80  80 
    1 0 0  100 100/100 
     1 2   7  7 
    2 0 0   11 11/100 

df1 = df.reset_index(drop=True, level=['block', 'geo']) 


mask3 = (df.index.get_level_values('mun') != 0) & \ 
     (df.index.get_level_values('loc') != 0) & \ 
     (df.index.get_level_values('geo') == 0) & \ 
     (df.index.get_level_values('block') == 0) 

print (mask3) 
[False False True False False True False False True False True] 

df2 = df1.ix[mask3, 'data1'].groupby(level=['mun']).max() 
#print (df2) 

df2 =df2.reindex(df.reset_index(level=['geo','block', 'loc'], drop=True).index).mask(~mask3).fillna(1) 
#print (df2) 
print (df['data1'].div(df2.values,axis=0)) 
mun loc geo block 
0 0 0 0  14.00 
1 0 0 0  12.00 
    1 0 0   1.00 
      1 0  10.00 
       1  31.00 
    2 0 0   0.75 
      1 1  11.00 
2 0 0 0  80.00 
    1 0 0   1.00 
      1 2   7.00 
    2 0 0   0.11 
dtype: float64 

수준 mun :

print (df) 
        data1 data2 
mun loc geo block    
0 0 0 0   55  55 
1 0 0 0   70 70/70 
    1 0 0   12  12 
     1 0   13  13 
2 0 0 0   60 60/70 
    1 1 1   12  12 
     2 1   6  6 
3 0 0 0   12 12/70 

mask3 = (df.index.get_level_values('mun') != 0) & \ 
     (df.index.get_level_values('loc') == 0) & \ 
     (df.index.get_level_values('geo') == 0) & \ 
     (df.index.get_level_values('block') == 0) 

print (mask3) 
[False True False False True False False True] 

df2 = df.ix[mask3, 'data1'].max() 
#print (df2) 

df2 = pd.Series(df2, index=df.index).mask(~mask3).fillna(1) 
#print (df2) 
print (df['data1'].div(df2.values,axis=0)) 
mun loc geo block 
0 0 0 0  55.000000 
1 0 0 0   1.000000 
    1 0 0  12.000000 
      1 0  13.000000 
2 0 0 0   0.857143 
    1 1 1  12.000000 
      2 1   6.000000 
3 0 0 0   0.171429 
dtype: float64 
+0

감사합니다. 나는 theres에있는 theres에있는 과실을 생각한다. 부문을 수행하지 않습니다 ... 모든 결과를 하나의 단일 열로 통합하려는 경우 어떻게해야합니까? – marco

+1

문제를 찾으려고합니다. 새로운 열이 필요하다면'df [ 'new']'= (df [ 'data1'] .div (df2.values, axis = 0))','NaN'을 반환하면'df [ 'new'] '= (df [ 'data1'] .div (df2.values, axis = 0) .values)' – jezrael

+0

그래도 이전 계산의 위에 덮어 쓴다. 블록을하면 위치가 겹쳐서 색인 수준의 데이터 2에 data1과 동일한 값이 표시됩니다. – marco