programing

열별로 그룹화된 것을 색인으로 만들지 않고 그룹화하는 판다.

elecom 2023. 10. 30. 20:32
반응형

열별로 그룹화된 것을 색인으로 만들지 않고 그룹화하는 판다.

팬더 그룹 바이의 기본 동작은 열 단위의 그룹을 인덱스로 변환하여 데이터 프레임의 열 목록에서 제거하는 것입니다.예를 들어, 이 열이 있는 dataFrame이 있다고 가정합니다.

col1|col2|col3|col4

열을 붙여 그룹을 적용하면.col2그리고.col3이쪽입니다.

df.groupby(['col2','col3']).sum()

데이터 프레임df더 이상은 없습니다.['col2','col3']열 목록에결과 데이터 프레임의 인덱스로 자동 변환됩니다.

제 질문은 열에 그룹별로 그룹을 수행하면서도 그 열을 데이터 프레임에 유지할 수 있는 방법입니다.

df.groupby(['col2','col3'], as_index=False).sum()

이를 위한 또 다른 방법은 다음과 같습니다.

df.groupby(['col2', 'col3']).sum().reset_index()

다음과 같은 다소 상세한 답변이 추가되어 어떤 답변을 사용해야 할지 여전히 혼란스러운 분들을 돕습니다.

첫째, 이 문제에 대해 제안된 두 가지 해결책은 다음과 같습니다.

  • 해결책 1:df.groupby(['A', 'B'], as_index=False).sum()
  • 해결책 2:df.groupby(['A', 'B']).sum().reset_index()

둘 다 예상한 결과를 줍니다.


해결책 1:

설명서에서 설명한 바와 같이,as_index는 SQL 스타일 그룹화된 출력을 요청할 것이며, 이는 효과적으로 팬더들이 준비되는 대로 출력에서 열로 그룹화된 이들을 보존하도록 요청할 것입니다.

as_index: boole, default True

집계된 출력의 경우 그룹 레이블을 인덱스로 하는 개체를 반환합니다.DataFrame 입력에만 해당됩니다.as_index= false는 효과적으로 "SQL 스타일" 그룹화된 출력입니다.

예:

주어진 데이터 프레임:

     A     B      C      D
0    A     1  0.502130  0.959404
1    A     3  0.335416  0.087215
2    B     2  0.067308  0.084595
3    B     4  0.454158  0.723124
4    B     4  0.323326  0.895858
5    C     2  0.672375  0.356736
6    C     5  0.929655  0.371913
7    D     5  0.212634  0.540736
8    D     5  0.471418  0.268270
9    E     1  0.061270  0.739610

첫 번째 솔루션을 적용하면 다음과 같은 이점이 있습니다.

>>> df.groupby(["A", "B"], as_index=False).sum()

     A     B      C        D
0    A     1  0.502130  0.959404
1    A     3  0.335416  0.087215
2    B     2  0.067308  0.084595
3    B     4  0.777483  1.618982
4    C     2  0.672375  0.356736
5    C     5  0.929655  0.371913
6    D     5  0.684052  0.809006
7    E     1  0.061270  0.739610

그룹 기준 열이 올바르게 보존되는 경우.


해결책 2:

두 번째 솔루션을 이해하려면 다음과 같이 이전 명령의 출력을 살펴보겠습니다.as_index = True기본적인 동작입니다.pandas.DataFrame.groupby(문서 확인):

>>> df.groupby(["A", "B"], as_index=True).sum()
               C       D
A    B                    
A    1     0.502130  0.959404
     3     0.335416  0.087215
B    2     0.067308  0.084595
     4     0.777483  1.618982
C    2     0.672375  0.356736
     5     0.929655  0.371913
D    5     0.684052  0.809006
E    1     0.061270  0.739610

보시다시피 키별 그룹은 데이터 프레임의 인덱스가 됩니다.사용.pandas.DataFrame.reset_index(문서 확인) 데이터 프레임의 인덱스를 열로 되돌리고 기본 인덱스를 사용할 수 있습니다.또한 이전 단계와 동일한 결과로 이어집니다.

>>> df.groupby(['A', 'B']).sum().reset_index()
     A     B      C        D
0    A     1  0.502130  0.959404
1    A     3  0.335416  0.087215
2    B     2  0.067308  0.084595
3    B     4  0.777483  1.618982
4    C     2  0.672375  0.356736
5    C     5  0.929655  0.371913
6    D     5  0.684052  0.809006
7    E     1  0.061270  0.739610

벤치마크

첫 번째 솔루션이 두 번째 솔루션에서 1단계와 2단계로 요구 사항을 달성하므로 전자가 약간 더 빠릅니다.

%timeit df.groupby(["A", "B"], as_index=False).sum()
3.38 ms ± 21.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df.groupby(["A", "B"]).sum().reset_index()
3.9 ms ± 365 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

언급URL : https://stackoverflow.com/questions/32059397/pandas-groupby-without-turning-grouped-by-column-into-index

반응형