sourcecode

데이터 프레임을 피벗하려면 어떻게 해야 합니까?

copyscript 2022. 9. 18. 10:07
반응형

데이터 프레임을 피벗하려면 어떻게 해야 합니까?

  • 피벗이란?
  • 피벗하려면 어떻게 해야 하나요?
  • 이게 피벗이에요?
  • 완전 포맷에서 와이드 포맷으로?

피벗 테이블에 대한 질문을 많이 봐왔습니다.고객이 피벗 테이블에 대해 질문하고 있는지 모르는 경우라도, 보통은 질문하고 있습니다.피벗의 모든 측면을 망라한 표준 문답을 작성하는 것은 사실상 불가능하다.

...하지만 한번 해보려고 합니다.


기존 질문과 답변의 문제는 대부분의 경우 질문이 기존의 좋은 답변을 사용하기 위해 OP가 일반화하는 데 어려움을 겪는 뉘앙스에 초점이 맞춰진다는 것입니다.단, 어떤 답변도 포괄적인 설명을 하지 않습니다(힘든 작업이기 때문에).

§ 구글 검색에서 몇 가지 예를 살펴봅니다.

  1. Panda에서 데이터 프레임을 피벗하려면 어떻게 해야 합니까?
  • 좋은 질의응답입니다.그러나 답은 구체적인 질문에만 대답할 뿐 거의 설명하지 않는다.
  1. Panda 테이블에서 데이터 프레임으로 피벗
  • 이 질문에서 OP는 피벗의 출력과 관련이 있습니다.즉, 기둥의 모양입니다.OP는 R처럼 보이길 원했다.이것은 판다 사용자들에게 큰 도움이 되지 않는다.
  1. 데이터 프레임을 회전하는 팬더, 중복된 행
  • 하나의 만, , 즉, '일부러', '일부러', '일부러', '일부러', '일부러'입니다.pd.DataFrame.pivot

래래누 for for for를 검색할 pivot산발적인 결과를 얻지만 구체적인 질문에 답할 수 없습니다.


세우다

아래 답변에서 피벗하는 방법에 따라 내 열과 관련 열 값의 이름이 눈에 띄게 지정되었다는 것을 알 수 있습니다.

import numpy as np
import pandas as pd
from numpy.core.defchararray import add

np.random.seed([3,1415])
n = 20

cols = np.array(['key', 'row', 'item', 'col'])
arr1 = (np.random.randint(5, size=(n, 4)) // [2, 1, 2, 1]).astype(str)

df = pd.DataFrame(
    add(cols, arr1), columns=cols
).join(
    pd.DataFrame(np.random.rand(n, 2).round(2)).add_prefix('val')
)
print(df)

     key   row   item   col  val0  val1
0   key0  row3  item1  col3  0.81  0.04
1   key1  row2  item1  col2  0.44  0.07
2   key1  row0  item1  col0  0.77  0.01
3   key0  row4  item0  col2  0.15  0.59
4   key1  row0  item2  col1  0.81  0.64
5   key1  row2  item2  col4  0.13  0.88
6   key2  row4  item1  col3  0.88  0.39
7   key1  row4  item1  col1  0.10  0.07
8   key1  row0  item2  col4  0.65  0.02
9   key1  row2  item0  col2  0.35  0.61
10  key2  row0  item2  col1  0.40  0.85
11  key2  row4  item1  col2  0.64  0.25
12  key0  row2  item2  col3  0.50  0.44
13  key0  row4  item1  col4  0.24  0.46
14  key1  row3  item2  col3  0.28  0.11
15  key0  row3  item1  col1  0.31  0.23
16  key0  row0  item2  col3  0.86  0.01
17  key0  row4  item0  col3  0.64  0.21
18  key2  row2  item2  col0  0.13  0.45
19  key0  row2  item0  col4  0.37  0.70

질문

  1. ?가?ValueError: Index contains duplicate entries, cannot reshape

  2. 하면 피벗을 할 수 있을까요?df그 때문에col열입니다.row입니다.val0치란무??? ??

     col   col0   col1   col2   col3  col4
     row
     row0  0.77  0.605    NaN  0.860  0.65
     row2  0.13    NaN  0.395  0.500  0.25
     row3   NaN  0.310    NaN  0.545   NaN
     row4   NaN  0.100  0.395  0.760  0.24
    
  3. 하면 피벗을 할 수 있을까요?df그 때문에col열입니다.row, 입니다.val0이고, 은 '결측값'입니다.0

     col   col0   col1   col2   col3  col4
     row
     row0  0.77  0.605  0.000  0.860  0.65
     row2  0.13  0.000  0.395  0.500  0.25
     row3  0.00  0.310  0.000  0.545  0.00
     row4  0.00  0.100  0.395  0.760  0.24
    
  4. 다른 걸로 주세요mean를 ★★★★★★★★★★★★」sum

     col   col0  col1  col2  col3  col4
     row
     row0  0.77  1.21  0.00  0.86  0.65
     row2  0.13  0.00  0.79  0.50  0.50
     row3  0.00  0.31  0.00  1.09  0.00
     row4  0.00  0.10  0.79  1.52  0.24
    
  5. 한 번에 한 집계를 여러 개 수행할 수 있습니까?

            sum                          mean
     col   col0  col1  col2  col3  col4  col0   col1   col2   col3  col4
     row
     row0  0.77  1.21  0.00  0.86  0.65  0.77  0.605  0.000  0.860  0.65
     row2  0.13  0.00  0.79  0.50  0.50  0.13  0.000  0.395  0.500  0.25
     row3  0.00  0.31  0.00  1.09  0.00  0.00  0.310  0.000  0.545  0.00
     row4  0.00  0.10  0.79  1.52  0.24  0.00  0.100  0.395  0.760  0.24
    
  6. 여러 개의 값 열에 걸쳐 집계할 수 있습니까?

           val0                             val1
     col   col0   col1   col2   col3  col4  col0   col1  col2   col3  col4
     row
     row0  0.77  0.605  0.000  0.860  0.65  0.01  0.745  0.00  0.010  0.02
     row2  0.13  0.000  0.395  0.500  0.25  0.45  0.000  0.34  0.440  0.79
     row3  0.00  0.310  0.000  0.545  0.00  0.00  0.230  0.00  0.075  0.00
     row4  0.00  0.100  0.395  0.760  0.24  0.00  0.070  0.42  0.300  0.46
    
  7. 여러 열로 세분화할 수 있습니까?

     item item0             item1                         item2
     col   col2  col3  col4  col0  col1  col2  col3  col4  col0   col1  col3  col4
     row
     row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.605  0.86  0.65
     row2  0.35  0.00  0.37  0.00  0.00  0.44  0.00  0.00  0.13  0.000  0.50  0.13
     row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.000  0.28  0.00
     row4  0.15  0.64  0.00  0.00  0.10  0.64  0.88  0.24  0.00  0.000  0.00  0.00
    
  8. 또는

     item      item0             item1                         item2
     col        col2  col3  col4  col0  col1  col2  col3  col4  col0  col1  col3  col4
     key  row
     key0 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.86  0.00
          row2  0.00  0.00  0.37  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.50  0.00
          row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.00  0.00  0.00
          row4  0.15  0.64  0.00  0.00  0.00  0.00  0.00  0.24  0.00  0.00  0.00  0.00
     key1 row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.81  0.00  0.65
          row2  0.35  0.00  0.00  0.00  0.00  0.44  0.00  0.00  0.00  0.00  0.00  0.13
          row3  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.28  0.00
          row4  0.00  0.00  0.00  0.00  0.10  0.00  0.00  0.00  0.00  0.00  0.00  0.00
     key2 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.40  0.00  0.00
          row2  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.13  0.00  0.00  0.00
          row4  0.00  0.00  0.00  0.00  0.00  0.64  0.88  0.00  0.00  0.00  0.00  0.00
    
  9. 열과 행이 함께 발생하는 빈도(일명 "교차표")를 집계할 수 있습니까?

     col   col0  col1  col2  col3  col4
     row
     row0     1     2     0     1     1
     row2     1     0     2     1     2
     row3     0     1     0     2     0
     row4     0     1     2     2     1
    
  10. 두 열만 피벗하여 DataFrame을 긴 열에서 넓은 열로 변환하려면 어떻게 해야 합니까?정해진,

    np.random.seed([3, 1415])
    df2 = pd.DataFrame({'A': list('aaaabbbc'), 'B': np.random.choice(15, 8)})
    df2
       A   B
    0  a   0
    1  a  11
    2  a   2
    3  a  11
    4  b  10
    5  b  10
    6  b  14
    7  c   7
    

    예상된 것은 다음과 같아야 합니다.

          a     b    c
    0   0.0  10.0  7.0
    1  11.0  10.0  NaN
    2   2.0  14.0  NaN
    3  11.0   NaN  NaN
    
  11. 요?pivot

    부터

       1  2
       1  1  2
    a  2  1  1
    b  2  1  0
    c  1  0  0
    

    로.

       1|1  2|1  2|2
    a    2    1    1
    b    2    1    0
    c    1    0    0
    

첫 번째 질문에 답하는 것으로 시작합니다.

질문 1

?가?ValueError: Index contains duplicate entries, cannot reshape

이것은 판다들이 재인덱스를 시도하고 있기 때문에 발생합니다.columns ★★★★★★★★★★★★★★★★★」index할 수 합니다.피벗을 수행할 수 있는 방법은 다양합니다.이들 중 일부는 피벗을 요구하는 키의 중복이 있을 때 적합하지 않습니다.고려하다pd.DataFrame.pivot가 있는 은 알고 있습니다.row ★★★★★★★★★★★★★★★★★」col§:

df.duplicated(['row', 'col']).any()

True

내가 ★★★★★★★★★★★★★★★★★★★★★.pivot.

df.pivot(index='row', columns='col', values='val0')

위의 에러가 발생.실제로 다음과 같은 작업을 수행하려고 하면 동일한 오류가 발생합니다.

df.set_index(['row', 'col'])['val0'].unstack()

다음은 피벗에 사용할 수 있는 관용어 목록입니다.

  1. pd.DataFrame.groupby + pd.DataFrame.unstack

    • 거의 모든 유형의 피벗을 수행하는 데 적합한 일반적인 접근 방식
    • 한 그룹에서 피벗된 행 수준 및 열 수준을 구성할 열을 모두 지정합니다.그런 다음 집계할 나머지 열과 집계를 수행할 함수를 선택합니다. 당신은unstack열 인덱스에 포함할 수준을 선택합니다.
  2. pd.DataFrame.pivot_table

    • 「 」의.groupbyAPI를 사용하다이치노이치노
    • 행 수준, 열 수준, 집계할 값 및 집계를 수행할 함수를 지정합니다.
  3. pd.DataFrame.set_index + pd.DataFrame.unstack

    • 일부 사용자에게는 편리하고 직관적입니다(자신도 포함).중복된 그룹화된 키를 처리할 수 없습니다.
    • 와슷비 the the the the the similar와 비슷해요.groupby패러다임에서는 행 또는 열 수준이 될 모든 열을 지정하고 이러한 열을 인덱스로 설정합니다. 후, 「 」라고 합니다.unstack열에서 원하는 수준입니다.나머지 인덱스 수준 또는 열 수준 중 하나가 고유하지 않으면 이 방법이 실패합니다.
  4. pd.DataFrame.pivot

    • 비슷해요.set_index중복된 키 제한을 공유한다는 점에서.API를 사용합니다.은 스칼라 값만 합니다.index,columns,values.
    • 와슷비 the the the the the similar와 비슷해요.pivot_table피벗할 행, 열 및 값을 선택하는 방식입니다.그러나 집계할 수 없으며 행 또는 열이 고유하지 않으면 이 방법은 실패합니다.
  5. pd.crosstab

    • 입니다.pivot_table그리고 가장 순수한 형태로 여러 작업을 수행하는 가장 직관적인 방법입니다.
  6. pd.factorize + np.bincount

    • 이것은 매우 불명확하지만 매우 빠른 고도의 기술이다.모든 상황에서 사용할 수 있는 것은 아니지만, 사용할 수 있고 사용하기 편리할 때 성과급을 받을 수 있습니다.
  7. pd.get_dummies + pd.DataFrame.dot

    • 나는 이것을 교묘하게 교차표 작성에 사용한다.

이후의 각 답변 및 질문에 대해 수행할 작업은 를 사용하여 답변하는 것입니다.그럼 같은 작업을 할 수 있는 대안을 제시하겠습니다.

질문 3

하면 피벗을 할 수 있을까요?df그 때문에col열입니다.row, 입니다.val0이고, 은 '결측값'입니다.0

  • pd.DataFrame.pivot_table

    • fill_value디폴트로는 설정되어 있지 않습니다.나는 그것을 적절히 설정하는 경향이 있다.이 경우로 설정합니다.0질문 2는 생략했습니다.이것은 이 답변과 같기 때문입니다.fill_value

    • aggfunc='mean'디폴트이기 때문에 설정할 필요가 없었습니다.나는 분명히 하기 위해 그것을 포함시켰다.

          df.pivot_table(
              values='val0', index='row', columns='col',
              fill_value=0, aggfunc='mean')
      
          col   col0   col1   col2   col3  col4
          row
          row0  0.77  0.605  0.000  0.860  0.65
          row2  0.13  0.000  0.395  0.500  0.25
          row3  0.00  0.310  0.000  0.545  0.00
          row4  0.00  0.100  0.395  0.760  0.24
      
  • pd.DataFrame.groupby

      df.groupby(['row', 'col'])['val0'].mean().unstack(fill_value=0)
    
  • pd.crosstab

      pd.crosstab(
          index=df['row'], columns=df['col'],
          values=df['val0'], aggfunc='mean').fillna(0)
    

질문 4

다른 걸로 주세요mean를 ★★★★★★★★★★★★」sum

  • pd.DataFrame.pivot_table

      df.pivot_table(
          values='val0', index='row', columns='col',
          fill_value=0, aggfunc='sum')
    
      col   col0  col1  col2  col3  col4
      row
      row0  0.77  1.21  0.00  0.86  0.65
      row2  0.13  0.00  0.79  0.50  0.50
      row3  0.00  0.31  0.00  1.09  0.00
      row4  0.00  0.10  0.79  1.52  0.24
    
  • pd.DataFrame.groupby

      df.groupby(['row', 'col'])['val0'].sum().unstack(fill_value=0)
    
  • pd.crosstab

      pd.crosstab(
          index=df['row'], columns=df['col'],
          values=df['val0'], aggfunc='sum').fillna(0)
    

질문 5

한 번에 한 집계를 여러 개 수행할 수 있습니까?

「 」에 대해서는, 을해 주세요.pivot_table ★★★★★★★★★★★★★★★★★」crosstab난 비위 맞추기 목록을 통과해야 했다. 반,는groupby.agg한정된 수의 특수 기능에 대해 문자열을 사용할 수 있습니다. groupby.agg님은 다른 사람에게 전달한 콜러블과 동일한 콜러블을 사용했을 수도 있습니다만, 효율이 향상되기 때문에 문자열 함수명을 활용하는 것이 효율적입니다.

  • pd.DataFrame.pivot_table

      df.pivot_table(
          values='val0', index='row', columns='col',
          fill_value=0, aggfunc=[np.size, np.mean])
    
           size                      mean
      col  col0 col1 col2 col3 col4  col0   col1   col2   col3  col4
      row
      row0    1    2    0    1    1  0.77  0.605  0.000  0.860  0.65
      row2    1    0    2    1    2  0.13  0.000  0.395  0.500  0.25
      row3    0    1    0    2    0  0.00  0.310  0.000  0.545  0.00
      row4    0    1    2    2    1  0.00  0.100  0.395  0.760  0.24
    
  • pd.DataFrame.groupby

      df.groupby(['row', 'col'])['val0'].agg(['size', 'mean']).unstack(fill_value=0)
    
  • pd.crosstab

      pd.crosstab(
          index=df['row'], columns=df['col'],
          values=df['val0'], aggfunc=[np.size, np.mean]).fillna(0, downcast='infer')
    

질문 6

여러 개의 값 열에 걸쳐 집계할 수 있습니까?

  • pd.DataFrame.pivot_table 우리는 지나간다values=['val0', 'val1']

      df.pivot_table(
          values=['val0', 'val1'], index='row', columns='col',
          fill_value=0, aggfunc='mean')
    
            val0                             val1
      col   col0   col1   col2   col3  col4  col0   col1  col2   col3  col4
      row
      row0  0.77  0.605  0.000  0.860  0.65  0.01  0.745  0.00  0.010  0.02
      row2  0.13  0.000  0.395  0.500  0.25  0.45  0.000  0.34  0.440  0.79
      row3  0.00  0.310  0.000  0.545  0.00  0.00  0.230  0.00  0.075  0.00
      row4  0.00  0.100  0.395  0.760  0.24  0.00  0.070  0.42  0.300  0.46
    
  • pd.DataFrame.groupby

      df.groupby(['row', 'col'])['val0', 'val1'].mean().unstack(fill_value=0)
    

질문 7

여러 열로 세분화할 수 있습니까?

  • pd.DataFrame.pivot_table

      df.pivot_table(
          values='val0', index='row', columns=['item', 'col'],
          fill_value=0, aggfunc='mean')
    
      item item0             item1                         item2
      col   col2  col3  col4  col0  col1  col2  col3  col4  col0   col1  col3  col4
      row
      row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.605  0.86  0.65
      row2  0.35  0.00  0.37  0.00  0.00  0.44  0.00  0.00  0.13  0.000  0.50  0.13
      row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.000  0.28  0.00
      row4  0.15  0.64  0.00  0.00  0.10  0.64  0.88  0.24  0.00  0.000  0.00  0.00
    
  • pd.DataFrame.groupby

      df.groupby(
          ['row', 'item', 'col']
      )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)
    

질문 8

여러 열로 세분화할 수 있습니까?

  • pd.DataFrame.pivot_table

      df.pivot_table(
          values='val0', index=['key', 'row'], columns=['item', 'col'],
          fill_value=0, aggfunc='mean')
    
      item      item0             item1                         item2
      col        col2  col3  col4  col0  col1  col2  col3  col4  col0  col1  col3  col4
      key  row
      key0 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.86  0.00
           row2  0.00  0.00  0.37  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.50  0.00
           row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.00  0.00  0.00
           row4  0.15  0.64  0.00  0.00  0.00  0.00  0.00  0.24  0.00  0.00  0.00  0.00
      key1 row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.81  0.00  0.65
           row2  0.35  0.00  0.00  0.00  0.00  0.44  0.00  0.00  0.00  0.00  0.00  0.13
           row3  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.28  0.00
           row4  0.00  0.00  0.00  0.00  0.10  0.00  0.00  0.00  0.00  0.00  0.00  0.00
      key2 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.40  0.00  0.00
           row2  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.13  0.00  0.00  0.00
           row4  0.00  0.00  0.00  0.00  0.00  0.64  0.88  0.00  0.00  0.00  0.00  0.00
    
  • pd.DataFrame.groupby

      df.groupby(
          ['key', 'row', 'item', 'col']
      )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)
    
  • pd.DataFrame.set_index 키 집합은 행과 열 모두에 대해 고유하기 때문입니다.

      df.set_index(
          ['key', 'row', 'item', 'col']
      )['val0'].unstack(['item', 'col']).fillna(0).sort_index(1)
    

질문 9

열과 행이 함께 발생하는 빈도(일명 "교차표")를 집계할 수 있습니까?

  • pd.DataFrame.pivot_table

      df.pivot_table(index='row', columns='col', fill_value=0, aggfunc='size')
    
          col   col0  col1  col2  col3  col4
      row
      row0     1     2     0     1     1
      row2     1     0     2     1     2
      row3     0     1     0     2     0
      row4     0     1     2     2     1
    
  • pd.DataFrame.groupby

      df.groupby(['row', 'col'])['val0'].size().unstack(fill_value=0)
    
  • pd.crosstab

      pd.crosstab(df['row'], df['col'])
    
  • pd.factorize + np.bincount

      # get integer factorization `i` and unique values `r`
      # for column `'row'`
      i, r = pd.factorize(df['row'].values)
      # get integer factorization `j` and unique values `c`
      # for column `'col'`
      j, c = pd.factorize(df['col'].values)
      # `n` will be the number of rows
      # `m` will be the number of columns
      n, m = r.size, c.size
      # `i * m + j` is a clever way of counting the
      # factorization bins assuming a flat array of length
      # `n * m`.  Which is why we subsequently reshape as `(n, m)`
      b = np.bincount(i * m + j, minlength=n * m).reshape(n, m)
      # BTW, whenever I read this, I think 'Bean, Rice, and Cheese'
      pd.DataFrame(b, r, c)
    
            col3  col2  col0  col1  col4
      row3     2     0     0     1     0
      row2     1     2     1     0     2
      row0     1     0     1     2     1
      row4     2     2     0     1     1
    
  • pd.get_dummies

      pd.get_dummies(df['row']).T.dot(pd.get_dummies(df['col']))
    
            col0  col1  col2  col3  col4
      row0     1     2     0     1     1
      row2     1     0     2     1     2
      row3     0     1     0     2     0
      row4     0     1     2     2     1
    

질문 10

두 열만 피벗하여 DataFrame을 긴 열에서 넓은 열로 변환하려면 어떻게 해야 합니까?

  • DataFrame.pivot

    첫 번째 단계는 각 행에 숫자를 할당하는 것입니다. 이 숫자는 피벗된 결과에서 해당 값의 행 인덱스가 됩니다.이것은, 다음의 방법으로 행해집니다.

      df2.insert(0, 'count', df2.groupby('A').cumcount())
      df2
    
         count  A   B
      0      0  a   0
      1      1  a  11
      2      2  a   2
      3      3  a  11
      4      0  b  10
      5      1  b  10
      6      2  b  14
      7      0  c   7
    

    두 번째 단계는 새로 작성된 열을 호출하는 인덱스로 사용하는 것입니다.

      df2.pivot(*df2)
      # df2.pivot(index='count', columns='A', values='B')
    
      A         a     b    c
      count
      0       0.0  10.0  7.0
      1      11.0  10.0  NaN
      2       2.0  14.0  NaN
      3      11.0   NaN  NaN
    
  • DataFrame.pivot_table

    는 열만 허용하고 어레이도 허용하므로GroupBy.cumcount 할 수 있다index명시적인 컬럼을 작성하지 않습니다.

      df2.pivot_table(index=df2.groupby('A').cumcount(), columns='A', values='B')
    
      A         a     b    c
      0       0.0  10.0  7.0
      1      11.0  10.0  NaN
      2       2.0  14.0  NaN
      3      11.0   NaN  NaN
    

질문 11

요?pivot

ifcolumns「」라고 입력합니다.object문자열 끈으로와join

df.columns = df.columns.map('|'.join)

다른또 다른format

df.columns = df.columns.map('{0[0]}|{0[1]}'.format)

@piRSQUARED의 답변을 다른 버전의 질문 10으로 확장하려면

질문 10.1

데이터 프레임:

d = data = {'A': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 3, 6: 5},
 'B': {0: 'a', 1: 'b', 2: 'c', 3: 'a', 4: 'b', 5: 'a', 6: 'c'}}
df = pd.DataFrame(d)

   A  B
0  1  a
1  1  b
2  1  c
3  2  a
4  2  b
5  3  a
6  5  c

출력:

   0     1     2
A
1  a     b     c
2  a     b  None
3  a  None  None
5  c  None  None

및 사용방법

t = df.groupby('A')['B'].apply(list)
out = pd.DataFrame(t.tolist(),index=t.index)
out
   0     1     2
A
1  a     b     c
2  a     b  None
3  a  None  None
5  c  None  None

또는 A와 함께 사용하는 것이 훨씬 더 좋습니다.

t = df.pivot_table(index='A',values='B',aggfunc=list).squeeze()
out = pd.DataFrame(t.tolist(),index=t.index)

피벗의 작동 방식을 더 잘 이해하려면 Panda 문서의 예를 참조하십시오.

여기에 이미지 설명 입력

df = pd.DataFrame({
    'foo': ['one', 'one', 'one', 'two', 'two', 'two'],
    'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
    'baz': [1, 2, 3, 4, 5, 6],
    'zoo': ['x', 'y', 'z', 'q', 'w', 't']
})

입력 테이블:

   foo bar  baz zoo
0  one   A    1   x
1  one   B    2   y
2  one   C    3   z
3  two   A    4   q
4  two   B    5   w
5  two   C    6   t

피벗:

pd.pivot(
    data=df,        
    index='foo',    # Column to use to make new frame’s index. If None, uses existing index.
    columns='bar',  # Column to use to make new frame’s columns.
    values='baz'    # Column(s) to use for populating new frame’s values.
)

출력 테이블:

bar  A  B  C
foo         
one  1  2  3
two  4  5  6

당신은 열 이름 목록을 다음과 같이 사용할 수 있습니다로 칼럼 이름 목록을 사용할 수 있다.index,,columns ★★★★★★★★★★★★★★★★★」values논쟁들.논쟁들.

rows, cols, vals, aggfuncs = ['row', 'key'], ['col', 'item'], ['val0', 'val1'], ['mean', 'sum']

df.groupby(rows+cols)[vals].agg(aggfuncs).unstack(cols)
# equivalently,
df.pivot_table(vals, rows, cols, aggfuncs)


df.set_index(rows+cols)[vals].unstack(cols)
# equivalently, 
df.pivot(rows, cols, vals)

또한 질문 10에서 뿐만 아니라 피벗 연산 multi-column에 통찰력 적용할 수 있습니다.질문 10의 통찰력을 다중 열 피벗 작업에 적용할 수도 있습니다.단순히 보조 인덱스를에서하면 됩니다 추가하기만 보조 지수 추가.groupby().cumcount()양쪽 어느 쪽이든에rows또는 또는cols어떻게 결과(결과를어떻게 얻느냐에 따라에적용 그것이 수행) 행선지에 따라.rows그 결과"오래","길게"만들고,그것을 에 추가합니다 결과를에 추가하게 만들어 준다.cols그것)" 넓은"게 만든다.'넓음'이 됩니다 cm이다.또한, 전화 또, 콜droplevel().reset_index()잉여 및 중복 인덱스의 문제를 해결합니다.

# for "long" result
df.assign(ix=df.groupby(rows+cols).cumcount()).pivot(rows+['ix'], cols, vals).droplevel(-1).reset_index()

# for "wide" result
df.assign(ix=df.groupby(rows+cols).cumcount()).pivot(rows, cols+['ix'], vals).droplevel(-1, axis=1).reset_index()

예를 들어, 다음이 작동하지 않습니다.

df = pd.DataFrame({'A': [1, 1, 2], 'B': ['a', 'a', 'b'], 'C': range(3)})
df.pivot('A','B','C')

그러나 다음 작업은 다음과 같습니다.

# long
(
    df.assign(ix=df.groupby(['A','B']).cumcount())
    .pivot(['A','ix'], 'B', 'C')
    .droplevel(-1).reset_index()
)

B  A    a    b
0  1  0.0  NaN
1  1  1.0  NaN
2  2  NaN  2.0



# wide
(
    df.assign(ix=df.groupby(['A','B']).cumcount())
    .pivot('A', ['B', 'ix'], 'C')
    .droplevel(-1, axis=1).reset_index()
)

B  A    a    a    b
0  1  0.0  1.0  NaN
1  2  NaN  NaN  2.0

pivot_table()aggfunc된 데이터가 되며, 는 집계된 데이터와 합니다.이것은, 데이터 수집과 매우 유사합니다.groupby.agg()pivot()재형성하거나 및 method의 ), .unstack() ★★★★★★★★★★★★★★★★★」stack().

실제로 소스코드를 내부적으로 확인하면 각 메서드 쌍은 동일합니다.

  1. pivot_table = 그룹별 + 언스택
  2. 피벗 = set_index + 분할 해제
  3. 크로스탭 = 피벗_테이블

OP의 설정 사용:

from numpy.core.defchararray import add
np.random.seed([3,1415])
n = 20

cols = np.array(['key', 'row', 'item', 'col'])
arr1 = (np.random.randint(5, size=(n, 4)) // [2, 1, 2, 1]).astype(str)

df = pd.DataFrame(add(cols, arr1), columns=cols).join(pd.DataFrame(np.random.rand(n, 2).round(2)).add_prefix('val'))

rows, cols, vals, aggfuncs = ['row', 'key'], ['col', 'val1'], ['val0'], ['mean', 'sum']
  1. pivot_table()는 값을 집약하여 언스택합니다.이 리스트는, 「」, 「1」, 「1」을 호출합니다.groupby()된 애그리게이터은 "grouter" 입니다).mean후, 「 」, 「 」, 「 」, 「 」를 unstack()열 목록을 기준으로 합니다.따라서 내부적으로 pivot_table = groupby + unstacking입니다.게다가 만약fill_valuefillna()출됩니니다다

    「」, 「」를 생성하는 .pv_1.gb_1를 참조해 주세요.

pv_1 = df.pivot_table(index=rows, columns=cols, values=vals, aggfunc=aggfuncs, fill_value=0)
# internal operation of `pivot_table()`
gb_1 = df.groupby(rows+cols)[vals].agg(aggfuncs).unstack(cols).fillna(0, downcast="infer")
pv_1.equals(gb_1) # True
  1. pivot()하여 MultiIndex DataFrame을 호출합니다.unstack()열 목록을 기준으로 합니다.따라서 내부적으로 피벗 = set_index + unstacking입니다.

    즉, 다음 항목이 모두 True입니다.

# if the entire df needs to be pivoted
pv_2 = df.pivot(index=rows, columns=cols)
# internal operation of `pivot()`
su_2 = df.set_index(rows+cols).unstack(cols)
pv_2.equals(su_2) # True

# if only subset of df.columns need to be considered for pivot, specify so
pv_3 = df.pivot(index=rows, columns=cols, values=vals)
su_3 = df.set_index(rows+cols)[vals].unstack(cols)
pv_3.equals(su_3) # True

# this is the precise method used internally (building a new DF seems to be faster than set_index of an existing one)
pv_4 = df.pivot(index=rows, columns=cols, values=vals)
su_4 = pd.DataFrame(df[vals].values, index=pd.MultiIndex.from_arrays([df[c] for c in rows+cols]), columns=vals).unstack(cols)
pv_4.equals(su_4) # True
  1. crosstab() ®pivot_table()즉, 크로스탭 = 피벗_테이블입니다.구체적으로는 전달된 값의 배열로 Data Frame을 구축하고 공통 인덱스와 호출에 따라 필터링합니다.pivot_table() 더더어 . . . . . . . . . 보다 더 입니다.pivot_table()은 1차원 하기 때문입니다.values는, 「」와 달리, 「」는 다릅니다.pivot_table() 수 .values.

    즉, 다음은 True입니다.

indexes, columns, values = [df[r] for r in rows], [df[c] for c in cols], next(df[v] for v in vals)
# crosstab
ct_5 = pd.crosstab(indexes, columns, values, aggfunc=aggfuncs)
# internal operation (abbreviated)
from functools import reduce
data = pd.DataFrame({f'row_{i}': r for i, r in enumerate(indexes)} | {f'col_{i}': c for i, c in enumerate(columns)} | {'v': values}, 
                    index = reduce(lambda x, y: x.intersection(y.index), indexes[1:]+columns, indexes[0].index)
                   )
pv_5 = data.pivot_table('v', [k for k in data if k[:4]=='row_'], [k for k in data if k[:4]=='col_'], aggfuncs)
ct_5.equals(pv_5) # True

언급URL : https://stackoverflow.com/questions/47152691/how-can-i-pivot-a-dataframe

반응형