[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/Data & AI

Pandas 데이터프레임 멀티 인덱싱

inu 2020. 7. 16. 19:08
반응형

멀티인덱싱

my_header = ['a','b','c']
my_index_zipped = [('G1', 1), ('G1', 2), ('G1', 3), ('G2', 1), ('G2', 2), ('G2', 3)]
my_index = pd.MultiIndex.from_tuples(my_index_zipped)
my_index.names = ['Big','Small']
df = pd.DataFrame(data = np.random.randn(6,3), index = my_index, columns = my_header)
df
==결과==
                a         b         c
Big Small                              
G1  1     -1.784733 -2.540311 -0.179349
    2     -0.389150  0.800740 -0.320251
    3     -1.584385 -0.215434 -1.871217
G2  1     -0.117310 -0.713936  0.502615
    2     -0.184741  0.202835 -0.229636
    3     -0.170846  1.538015  0.073847
  • 멀티인덱싱을 활용하면 데이터 프레임의 인덱스를 여러가지로 동시에 설정할 수 있다.
  • MultiIndex.from_tuple을 활용해 튜플로부터 인덱스 객체를 만들 수 있다.
  • 해당 객체는 인덱스별 이름을 부여할 수 있으며(my_index.name), 데이터프레임 생성시 옵션으로 활용해 부여할 수 있다.
print(df.loc['G1'])
==결과==
            a         b         c
Small                              
1     -1.784733 -2.540311 -0.179349
2     -0.389150  0.800740 -0.320251
3     -1.584385 -0.215434 -1.871217
  • 멀티 인덱싱한 데이터프레임은 말 그대로 인덱스가 여러개 생성된다.
  • 따라서 loc을 통해 하나의 인덱스를 풀어도 그 속에 또 인덱스가 존재하게 된다.

groupby와 멀티인덱싱

  • groupby는 데이터 프레임을 특정 컬럼의 항목을 기준으로 데이터들을 묶어주는 역할을 한다.
  • groupby에 여러개의 컬럼을 할당하면, 해당 컬럼들의 항목들을 기준으로 '멀티인덱싱'하며 데이터들을 묶는다.
            name gender  age  grade absence bloodtype  height  weight
0   Jared Diamond      M   23      3       Y         O   165.3    68.2
1  Sarah O'Donnel      F   22      2       N        AB   170.1    53.0
2    Brian Martin      M   24      4       N         B   175.0    80.1
...
  • 위와 같이 사람들에 대한 데이터가 있다고 하자.
sr = df.groupby(['gender', 'bloodtype','absence']).height.mean()
print(sr)
==결과==    
gender  bloodtype  absence
F       A          N          176.900000
                   Y          168.000000
        AB         N          170.100000
        B          N          158.200000
        O          N          164.433333
M       A          N          165.700000
        AB         N          181.050000
        B          N          176.533333
                   Y          168.600000
        O          Y          166.200000
Name: height, dtype: float64
  • gender, bloodtype, absence 별로 멀티인덱싱 및 그루핑처리해준다.

cf. 그룹별정렬

df.sort_values(by=['absence','bloodtype'], ascending=[True,False])
  • 참고로 정렬도 그룹별로 해줄 수 있다.(결과는 생략)
  • 'absence','bloodtype' 컬럼을 기준으로 '내림차순','오름차순' 정렬한다.
반응형