2014-04-16 2 views
4

저는 파이썬과 팬더 모두를 초보자입니다.Python에서 값 다중 인덱스 팬더 설정

데이터 프레임을 구성하고 나중에 값으로 채 웁니다.

나는

from pandas import * 

ageMin = 21 
ageMax = 31 
ageStep = 2 

bins_sumins = [0, 10000, 20000] 
bins_age = list(range(ageMin, ageMax, ageStep)) 
indeks_sex = ['M', 'F'] 
indeks_age = ['[{0}-{1})'.format(bins_age[i-1], bins_age[i]) for i in range(1, len(bins_age))] 
indeks_sumins = ['[{0}-{1})'.format(bins_sumins[i-1], bins_sumins[i]) for i in range(1, len(bins_sumins))] 
indeks = MultiIndex.from_product([indeks_age , indeks_sex ,indeks_sumins], names=['Age', 'Sex', 'Sumins']) 

cols = ['A', 'B', 'C', 'D'] 

df = DataFrame(data = 0, index = indeks, columns = cols) 

지금까지 모든 것이 잘 내 dataframe 구축했다. 나는

>>> df['B']['[21-23)']['M']['[10000-20000)'] = 2 
>>> df 
          A B C D 
Age  Sex Sumins     
[21-23) M [0-10000)  1 0 0 0 
      [10000-20000) 1 0 0 0 
     F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
[23-25) M [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
     F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
[25-27) M [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
     F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
[27-29) M [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
     F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
[16 rows x 4 columns] 

은 무슨 일 것입니다 ... 만 더 이동이없는 한 위치의 값을 설정, 값 그러나

>>> df['A']['[21-23)']['M'] = 1 
>>> df 
          A B C D 
Age  Sex Sumins     
[21-23) M [0-10000)  1 0 0 0 
      [10000-20000) 1 0 0 0 
     F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
[23-25) M [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
     F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
[25-27) M [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
     F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
[27-29) M [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
     F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 

의 전체 집합에 값을 할당 할 수 있어요? 나는 다중 색인화가 어떻게 작동하는지 완전히 오해했다는 생각에 개방적이다. 누군가?

+2

당신은 연결 할당을하고 있습니다. loc을 사용해야합니다. 색인 생성 문서를 확인하십시오. http://pandas.pydata.org/pandas-docs/stable/indexing.html –

+0

감사합니다. 나는 당신이 연결된 문서를 열람했으며,이 문제에 대한 확실한 설명을 해줍니다. – mortysporty

답변

5

첫째는, chained indexing

두 번째에있는 문서를 보라, 이것에 대해 needing to sort MultiIndices를 참조하십시오.

In [46]: df = df.sort_index() 

In [47]: df.loc['[21-23)', 'M', '[10000-20000)'] = 2 

In [48]: df 
Out[48]: 
          A B C D 
Age  Sex Sumins     
[21-23) F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
     M [0-10000)  0 0 0 0 
      [10000-20000) 2 2 2 2 
[23-25) F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
     M [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
[25-27) F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
     M [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
[27-29) F [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 
     M [0-10000)  0 0 0 0 
      [10000-20000) 0 0 0 0 

[16 rows x 4 columns] 

팬더 .14 일부 additional ways for slicing a MultiIndex이있을 것이다 :이 솔루션에 당신을 얻을 것이다

.

+2

빠른 답장을 보내 주셔서 감사합니다. 나는 당신의 제안 된 링크를 읽고 조금 더 조사했다. 하나의 요소 (특정 행의 특정 열)의 값만 설정하려면 먼저 데이터 프레임 (df [ 'A'])에서 관련 시리즈를 추출한 다음 해당 시리즈에서 loc을 사용합니다. -> df [ 'A']. loc [ '[21-23]', 'M', '[10000-20000]']. – mortysporty

+2

@mortysporty에게 감사의 말을 전합니다 !!! 이것을 설명하는 자신의 질문에 대답해야합니다. – Kolibrie