pandas의 iloc(loc) 메서드나 groupby 메서드를 사용하다보면 DataFrame의 특정 행마다 Index의 연속성이 끊어질 때가 있다.
특히 groupby 메서드로 그루핑한 뒤 각 그룹별로 Index를 새로 0 부터 만들고 싶을 때 reset_index 메서드를 사용하면 된다.
아래 코드는 과일 종류가 '사과', '포도', '배'가 있다고 가정할 때, 각각의 당도가 3, 3, 5인 DataFrame을 예시로 든다.
# col_0, col_1 을 각 컬럼으로 하는 DataFrame
df = pd.DataFrame({'과일': ['사과', '포도', '배'],
'당도': [3, 3, 5]})
결과
과일 당도
0 사과 3
1 포도 3
2 배 5
위에서 만든 DataFrame(df)에서 '당도'를 기준으로 그루핑(groupby 메서드 사용)을 하고 '당도'를 key로 가지는 dictionary(=grouped_data)를 확인하면,
당도가 3에 해당하는 '사과'와 '포도'를 하나의 DataFrame으로 갖고, 당도가 5에 해당하는 '배'를 하나의 DataFrame으로 갖는 것을 확인할 수 있다.
# 당도를 기준으로 그루핑
grouped_data: dict = dict(list(df.groupby(['당도'])))
결과
# 각 value의 dtype은 DataFrame 이다.
{3: 과일 당도
0 사과 3
1 포도 3,
5: 과일 당도
2 배 5}
이 때, 그루핑된 DataFrame 을 확인해보면 '사과'와 '포도'가 있는 첫 번째 DataFrame은 Index가 0 부터 시작하는 반면, '배'만 있는 두 번째 DataFrame은 Index가 2 부터 시작한다.
이는 groupby 메서드에 의해 그루핑이 되면, Index는 iloc(loc) 메서드를 사용한 것과 같이 최초 생성한 DataFrame(df)의 Index를 사용하기 때문인데, 각 그룹별로 새로운 Index를 만들어야 할 때, 아래와 같이 reset_index 메서드를 사용한다. (reset_index 메서드를 사용할 때, 전달하는 인자인 drop은 default 로 False 이다.)
Index가 2부터 시작하는 당도가 5인 그룹을 확인해보자. (dtype이 dict인 grouped_data는 DataFrame을 value로 반환한다.)
# drop=False (default)
grouped_data[5].reset_index() # 당도가 5인 그룹의 Index 초기화, drop=False
결과
index 과일 당도
0 2 배 5
결과는 위와 같이 그루핑된 DataFrame에 새로운 Index를 생성한다.
따라서 새로운 Index를 생성하지 않도록 이번엔 drop=True 로 전달하자.
# drop=True
grouped_data[5].reset_index(drop=True) # 당도가 5인 그룹의 Index 초기화, drop=True
결과
과일 당도
0 배 5
이제 위의 결과처럼 당도가 5인 그룹의 Index는 0부터 시작한다.
'Python > pandas' 카테고리의 다른 글
[pandas] TypeError: unsupported operand type(s) for *: 'float' and 'decimal.Decimal' 해결기 (0) | 2023.05.08 |
---|---|
[pandas] 두 개의 DataFrame을 SQL처럼 JOIN 하는 방법 (0) | 2023.05.08 |