데이터 프레임을 피벗하려면 어떻게 해야 합니까?
- 피벗이란?
- 피벗하려면 어떻게 해야 하나요?
- 이게 피벗이에요?
- 완전 포맷에서 와이드 포맷으로?
피벗 테이블에 대한 질문을 많이 봐왔습니다.고객이 피벗 테이블에 대해 질문하고 있는지 모르는 경우라도, 보통은 질문하고 있습니다.피벗의 모든 측면을 망라한 표준 문답을 작성하는 것은 사실상 불가능하다.
...하지만 한번 해보려고 합니다.
기존 질문과 답변의 문제는 대부분의 경우 질문이 기존의 좋은 답변을 사용하기 위해 OP가 일반화하는 데 어려움을 겪는 뉘앙스에 초점이 맞춰진다는 것입니다.단, 어떤 답변도 포괄적인 설명을 하지 않습니다(힘든 작업이기 때문에).
§ 구글 검색에서 몇 가지 예를 살펴봅니다.
- 좋은 질의응답입니다.그러나 답은 구체적인 질문에만 대답할 뿐 거의 설명하지 않는다.
- 이 질문에서 OP는 피벗의 출력과 관련이 있습니다.즉, 기둥의 모양입니다.OP는 R처럼 보이길 원했다.이것은 판다 사용자들에게 큰 도움이 되지 않는다.
- 하나의 만, , 즉, '일부러', '일부러', '일부러', '일부러', '일부러'입니다.
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
질문
?가?
ValueError: Index contains duplicate entries, cannot reshape
하면 피벗을 할 수 있을까요?
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
하면 피벗을 할 수 있을까요?
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
다른 걸로 주세요
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
한 번에 한 집계를 여러 개 수행할 수 있습니까?
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
여러 개의 값 열에 걸쳐 집계할 수 있습니까?
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
여러 열로 세분화할 수 있습니까?
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
또는
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
열과 행이 함께 발생하는 빈도(일명 "교차표")를 집계할 수 있습니까?
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
두 열만 피벗하여 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
요?
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()
다음은 피벗에 사용할 수 있는 관용어 목록입니다.
pd.DataFrame.groupby
+pd.DataFrame.unstack
- 거의 모든 유형의 피벗을 수행하는 데 적합한 일반적인 접근 방식
- 한 그룹에서 피벗된 행 수준 및 열 수준을 구성할 열을 모두 지정합니다.그런 다음 집계할 나머지 열과 집계를 수행할 함수를 선택합니다. 당신은
unstack
열 인덱스에 포함할 수준을 선택합니다.
-
- 「 」의.
groupby
API를 사용하다이치노이치노 - 행 수준, 열 수준, 집계할 값 및 집계를 수행할 함수를 지정합니다.
- 「 」의.
pd.DataFrame.set_index
+pd.DataFrame.unstack
- 일부 사용자에게는 편리하고 직관적입니다(자신도 포함).중복된 그룹화된 키를 처리할 수 없습니다.
- 와슷비 the the the the the similar와 비슷해요.
groupby
패러다임에서는 행 또는 열 수준이 될 모든 열을 지정하고 이러한 열을 인덱스로 설정합니다. 후, 「 」라고 합니다.unstack
열에서 원하는 수준입니다.나머지 인덱스 수준 또는 열 수준 중 하나가 고유하지 않으면 이 방법이 실패합니다.
-
- 비슷해요.
set_index
중복된 키 제한을 공유한다는 점에서.API를 사용합니다.은 스칼라 값만 합니다.index
,columns
,values
. - 와슷비 the the the the the similar와 비슷해요.
pivot_table
피벗할 행, 열 및 값을 선택하는 방식입니다.그러나 집계할 수 없으며 행 또는 열이 고유하지 않으면 이 방법은 실패합니다.
- 비슷해요.
-
- 입니다.
pivot_table
그리고 가장 순수한 형태로 여러 작업을 수행하는 가장 직관적인 방법입니다.
- 입니다.
-
- 이것은 매우 불명확하지만 매우 빠른 고도의 기술이다.모든 상황에서 사용할 수 있는 것은 아니지만, 사용할 수 있고 사용하기 편리할 때 성과급을 받을 수 있습니다.
pd.get_dummies
+pd.DataFrame.dot
- 나는 이것을 교묘하게 교차표 작성에 사용한다.
예
이후의 각 답변 및 질문에 대해 수행할 작업은 를 사용하여 답변하는 것입니다.그럼 같은 작업을 할 수 있는 대안을 제시하겠습니다.
질문 3
하면 피벗을 할 수 있을까요?
df
그 때문에col
열입니다.row
, 입니다.val0
이고, 은 '결측값'입니다.0
-
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
-
df.groupby(['row', 'col'])['val0'].mean().unstack(fill_value=0)
-
pd.crosstab( index=df['row'], columns=df['col'], values=df['val0'], aggfunc='mean').fillna(0)
질문 4
다른 걸로 주세요
mean
를 ★★★★★★★★★★★★」sum
-
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
-
df.groupby(['row', 'col'])['val0'].sum().unstack(fill_value=0)
-
pd.crosstab( index=df['row'], columns=df['col'], values=df['val0'], aggfunc='sum').fillna(0)
질문 5
한 번에 한 집계를 여러 개 수행할 수 있습니까?
「 」에 대해서는, 을해 주세요.pivot_table
★★★★★★★★★★★★★★★★★」crosstab
난 비위 맞추기 목록을 통과해야 했다. 반,는groupby.agg
한정된 수의 특수 기능에 대해 문자열을 사용할 수 있습니다. groupby.agg
님은 다른 사람에게 전달한 콜러블과 동일한 콜러블을 사용했을 수도 있습니다만, 효율이 향상되기 때문에 문자열 함수명을 활용하는 것이 효율적입니다.
-
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
-
df.groupby(['row', 'col'])['val0'].agg(['size', 'mean']).unstack(fill_value=0)
-
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
-
df.groupby(['row', 'col'])['val0', 'val1'].mean().unstack(fill_value=0)
질문 7
여러 열로 세분화할 수 있습니까?
-
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
-
df.groupby( ['row', 'item', 'col'] )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)
질문 8
여러 열로 세분화할 수 있습니까?
-
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
-
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
열과 행이 함께 발생하는 빈도(일명 "교차표")를 집계할 수 있습니까?
-
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
-
df.groupby(['row', 'col'])['val0'].size().unstack(fill_value=0)
-
pd.crosstab(df['row'], df['col'])
-
# 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(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을 긴 열에서 넓은 열로 변환하려면 어떻게 해야 합니까?
-
첫 번째 단계는 각 행에 숫자를 할당하는 것입니다. 이 숫자는 피벗된 결과에서 해당 값의 행 인덱스가 됩니다.이것은, 다음의 방법으로 행해집니다.
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
-
는 열만 허용하고 어레이도 허용하므로
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()
.
실제로 소스코드를 내부적으로 확인하면 각 메서드 쌍은 동일합니다.
- pivot_table = 그룹별 + 언스택
- 피벗 = set_index + 분할 해제
- 크로스탭 = 피벗_테이블
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']
pivot_table()
는 값을 집약하여 언스택합니다.이 리스트는, 「」, 「1」, 「1」을 호출합니다.groupby()
된 애그리게이터은 "grouter" 입니다).mean
후, 「 」, 「 」, 「 」, 「 」를unstack()
열 목록을 기준으로 합니다.따라서 내부적으로 pivot_table = groupby + unstacking입니다.게다가 만약fill_value
fillna()
출됩니니다다「」, 「」를 생성하는 .
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
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
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
'sourcecode' 카테고리의 다른 글
fprintf, printf, sprintf의 차이? (0) | 2022.09.18 |
---|---|
PHP에서 유용한 오류 메시지를 얻으려면 어떻게 해야 합니까? (0) | 2022.09.18 |
화살표 함수(공용 클래스 필드)를 클래스 메서드로 사용하는 방법 (0) | 2022.09.18 |
웹 사이트를 방문하는 컴퓨터를 고유하게 식별하려면 어떻게 해야 합니까? (0) | 2022.09.18 |
Matplotlib가 있는 Python의 플롯 시간 (0) | 2022.09.18 |