Pandas 고급 튜 토리 얼 의 Pandas 의 GroupBy 작업

15687 단어 PandasGroupBy사용법
간단 한 소개
pandas 의 DF 데이터 형식 은 데이터베이스 표 처럼 groupby 작업 을 할 수 있 습 니 다.일반적으로 groupby 작업 은 세 부분 으로 나 눌 수 있 습 니 다.데 이 터 를 분할 하고 변환 과 통합 데 이 터 를 응용 할 수 있 습 니 다.
본 고 는 Pandas 중의 groupby 조작 을 상세 하 게 설명 할 것 이다.
분할 데이터
데 이 터 를 분할 하 는 목적 은 DF 를 하나의 group 으로 분할 하 는 것 이다.groupby 작업 을 하기 위해 서 는 DF 를 만 들 때 해당 하 는 label 을 지정 해 야 합 니 다.

df = pd.DataFrame(
   ...:     {
   ...:         "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
   ...:         "B": ["one", "one", "two", "three", "two", "two", "one", "three"],
   ...:         "C": np.random.randn(8),
   ...:         "D": np.random.randn(8),
   ...:     }
   ...: )
   ...:

df
Out[61]: 
     A      B         C         D
0  foo    one -0.490565 -0.233106
1  bar    one  0.430089  1.040789
2  foo    two  0.653449 -1.155530
3  bar  three -0.610380 -0.447735
4  foo    two -0.934961  0.256358
5  bar    two -0.256263 -0.661954
6  foo    one -1.132186 -0.304330
7  foo  three  2.129757  0.445744
기본적으로 groupby 의 축 은 x 축 입 니 다.한 열 group 도 있 고 여러 열 group 도 있 습 니 다.

In [8]: grouped = df.groupby("A")

In [9]: grouped = df.groupby(["A", "B"])
다 중 인덱스
0.24 버 전에 서 index 가 많 으 면 특정한 index 를 선택 하여 group 을 진행 할 수 있 습 니 다.

In [10]: df2 = df.set_index(["A", "B"])

In [11]: grouped = df2.groupby(level=df2.index.names.difference(["B"]))

In [12]: grouped.sum()
Out[12]: 
            C         D
A                      
bar -1.591710 -1.739537
foo -0.752861 -1.402938
get_group
get_group 는 그룹 을 나 눈 후의 데 이 터 를 가 져 올 수 있 습 니 다:

In [24]: df3 = pd.DataFrame({"X": ["A", "B", "A", "B"], "Y": [1, 4, 3, 2]})

In [25]: df3.groupby(["X"]).get_group("A")
Out[25]: 
   X  Y
0  A  1
2  A  3

In [26]: df3.groupby(["X"]).get_group("B")
Out[26]: 
   X  Y
1  B  4
3  B  2
dropna
기본적으로 NaN 데 이 터 는 groupby 에서 제 외 됩 니 다.dropna=False 설정 을 통 해 NaN 데 이 터 를 허용 할 수 있 습 니 다.

In [27]: df_list = [[1, 2, 3], [1, None, 4], [2, 1, 3], [1, 2, 2]]

In [28]: df_dropna = pd.DataFrame(df_list, columns=["a", "b", "c"])

In [29]: df_dropna
Out[29]: 
   a    b  c
0  1  2.0  3
1  1  NaN  4
2  2  1.0  3
3  1  2.0  2

# Default ``dropna`` is set to True, which will exclude NaNs in keys
In [30]: df_dropna.groupby(by=["b"], dropna=True).sum()
Out[30]: 
     a  c
b        
1.0  2  3
2.0  2  5

# In order to allow NaN in keys, set ``dropna`` to False
In [31]: df_dropna.groupby(by=["b"], dropna=False).sum()
Out[31]: 
     a  c
b        
1.0  2  3
2.0  2  5
NaN  1  4
그룹 속성
groupby 대상 은 groups 속성 이 있 습 니 다.key-value 사전 입 니 다.key 는 분류 하 는 데이터 이 고 value 는 분류 에 대응 하 는 값 입 니 다.

In [34]: grouped = df.groupby(["A", "B"])

In [35]: grouped.groups
Out[35]: {('bar', 'one'): [1], ('bar', 'three'): [3], ('bar', 'two'): [5], ('foo', 'one'): [0, 6], ('foo', 'three'): [7], ('foo', 'two'): [2, 4]}

In [36]: len(grouped)
Out[36]: 6
index 의 등급
다단 계 index 대상 에 대해 groupby 는 group 의 index 등급 을 지정 할 수 있 습 니 다.

In [40]: arrays = [
   ....:     ["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],
   ....:     ["one", "two", "one", "two", "one", "two", "one", "two"],
   ....: ]
   ....: 

In [41]: index = pd.MultiIndex.from_arrays(arrays, names=["first", "second"])

In [42]: s = pd.Series(np.random.randn(8), index=index)

In [43]: s
Out[43]: 
first  second
bar    one      -0.919854
       two      -0.042379
baz    one       1.247642
       two      -0.009920
foo    one       0.290213
       two       0.495767
qux    one       0.362949
       two       1.548106
dtype: float64
그룹 1 레벨:

In [44]: grouped = s.groupby(level=0)

In [45]: grouped.sum()
Out[45]: 
first
bar   -0.962232
baz    1.237723
foo    0.785980
qux    1.911055
dtype: float64
group 2 레벨:

In [46]: s.groupby(level="second").sum()
Out[46]: 
second
one    0.980950
two    1.991575
dtype: float64
group 의 옮 겨 다 니 기
group 대상 을 얻 은 후에 우 리 는 for 문 구 를 통 해 group 를 옮 겨 다 닐 수 있 습 니 다.

In [62]: grouped = df.groupby('A')

In [63]: for name, group in grouped:
   ....:     print(name)
   ....:     print(group)
   ....: 
bar
     A      B         C         D
1  bar    one  0.254161  1.511763
3  bar  three  0.215897 -0.990582
5  bar    two -0.077118  1.211526
foo
     A      B         C         D
0  foo    one -0.575247  1.346061
2  foo    two -1.143704  1.627081
4  foo    two  1.193555 -0.441652
6  foo    one -0.408530  0.268520
7  foo  three -0.862495  0.024580
다 중 필드 group 이 라면 group 의 이름 은 원 그룹 입 니 다.

In [64]: for name, group in df.groupby(['A', 'B']):
   ....:     print(name)
   ....:     print(group)
   ....: 
('bar', 'one')
     A    B         C         D
1  bar  one  0.254161  1.511763
('bar', 'three')
     A      B         C         D
3  bar  three  0.215897 -0.990582
('bar', 'two')
     A    B         C         D
5  bar  two -0.077118  1.211526
('foo', 'one')
     A    B         C         D
0  foo  one -0.575247  1.346061
6  foo  one -0.408530  0.268520
('foo', 'three')
     A      B         C        D
7  foo  three -0.862495  0.02458
('foo', 'two')
     A    B         C         D
2  foo  two -1.143704  1.627081
4  foo  two  1.193555 -0.441652
취 합 작업
그룹 을 나 눈 후 취 합 작업 을 할 수 있 습 니 다:

In [67]: grouped = df.groupby("A")

In [68]: grouped.aggregate(np.sum)
Out[68]: 
            C         D
A                      
bar  0.392940  1.732707
foo -1.796421  2.824590

In [69]: grouped = df.groupby(["A", "B"])

In [70]: grouped.aggregate(np.sum)
Out[70]: 
                  C         D
A   B                        
bar one    0.254161  1.511763
    three  0.215897 -0.990582
    two   -0.077118  1.211526
foo one   -0.983776  1.614581
    three -0.862495  0.024580
    two    0.049851  1.185429
다 index 데이터 에 있어 서 기본 반환 값 도 다 index 입 니 다.새로운 index 를 사용 하려 면 as 를 추가 할 수 있 습 니 다.index = False:

In [71]: grouped = df.groupby(["A", "B"], as_index=False)

In [72]: grouped.aggregate(np.sum)
Out[72]: 
     A      B         C         D
0  bar    one  0.254161  1.511763
1  bar  three  0.215897 -0.990582
2  bar    two -0.077118  1.211526
3  foo    one -0.983776  1.614581
4  foo  three -0.862495  0.024580
5  foo    two  0.049851  1.185429

In [73]: df.groupby("A", as_index=False).sum()
Out[73]: 
     A         C         D
0  bar  0.392940  1.732707
1  foo -1.796421  2.824590
위의 효 과 는 reset 와 같 습 니 다.index

In [74]: df.groupby(["A", "B"]).sum().reset_index()
grouped.size()는 group 의 크기 를 계산 합 니 다.

In [75]: grouped.size()
Out[75]: 
     A      B  size
0  bar    one     1
1  bar  three     1
2  bar    two     1
3  foo    one     2
4  foo  three     1
5  foo    two     2
grouped.describe()는 group 의 정 보 를 설명 합 니 다.

In [76]: grouped.describe()
Out[76]: 
      C                                                    ...         D                                                  
  count      mean       std       min       25%       50%  ...       std       min       25%       50%       75%       max
0   1.0  0.254161       NaN  0.254161  0.254161  0.254161  ...       NaN  1.511763  1.511763  1.511763  1.511763  1.511763
1   1.0  0.215897       NaN  0.215897  0.215897  0.215897  ...       NaN -0.990582 -0.990582 -0.990582 -0.990582 -0.990582
2   1.0 -0.077118       NaN -0.077118 -0.077118 -0.077118  ...       NaN  1.211526  1.211526  1.211526  1.211526  1.211526
3   2.0 -0.491888  0.117887 -0.575247 -0.533567 -0.491888  ...  0.761937  0.268520  0.537905  0.807291  1.076676  1.346061
4   1.0 -0.862495       NaN -0.862495 -0.862495 -0.862495  ...       NaN  0.024580  0.024580  0.024580  0.024580  0.024580
5   2.0  0.024925  1.652692 -1.143704 -0.559389  0.024925  ...  1.462816 -0.441652  0.075531  0.592714  1.109898  1.627081

[6 rows x 16 columns]
유 니 버 설 집합 방법
다음은 일반적인 집합 방법 입 니 다.
함수.
묘사 하 다.mean()평균 값sum()화 해 를 구하 다size()계산 크기count()그룹의 통계std()표준 차var()분산sem()평균치 의 표준 오류describe()통계 정보 설명first()첫 번 째 그룹 값last()마지막 그룹 값nth()n 번 째 group 값min()최소 값max()최대 치
여러 개의 집합 방법 을 동시에 지정 할 수 있 습 니 다:

In [81]: grouped = df.groupby("A")

In [82]: grouped["C"].agg([np.sum, np.mean, np.std])
Out[82]: 
          sum      mean       std
A                                
bar  0.392940  0.130980  0.181231
foo -1.796421 -0.359284  0.912265
이름 변경 가능:

In [84]: (
   ....:     grouped["C"]
   ....:     .agg([np.sum, np.mean, np.std])
   ....:     .rename(columns={"sum": "foo", "mean": "bar", "std": "baz"})
   ....: )
   ....: 
Out[84]: 
          foo       bar       baz
A                                
bar  0.392940  0.130980  0.181231
foo -1.796421 -0.359284  0.912265
NamedAgg
NamedAgg 는 취 합 에 대해 더욱 정확 한 정 의 를 내 릴 수 있 습 니 다.column 과 aggfunc 두 개의 맞 춤 형 필드 를 포함 합 니 다.

In [88]: animals = pd.DataFrame(
   ....:     {
   ....:         "kind": ["cat", "dog", "cat", "dog"],
   ....:         "height": [9.1, 6.0, 9.5, 34.0],
   ....:         "weight": [7.9, 7.5, 9.9, 198.0],
   ....:     }
   ....: )
   ....: 

In [89]: animals
Out[89]: 
  kind  height  weight
0  cat     9.1     7.9
1  dog     6.0     7.5
2  cat     9.5     9.9
3  dog    34.0   198.0

In [90]: animals.groupby("kind").agg(
   ....:     min_height=pd.NamedAgg(column="height", aggfunc="min"),
   ....:     max_height=pd.NamedAgg(column="height", aggfunc="max"),
   ....:     average_weight=pd.NamedAgg(column="weight", aggfunc=np.mean),
   ....: )
   ....: 
Out[90]: 
      min_height  max_height  average_weight
kind                                        
cat          9.1         9.5            8.90
dog          6.0        34.0          102.75
또는 원 그룹 을 직접 사용 합 니 다:

In [91]: animals.groupby("kind").agg(
   ....:     min_height=("height", "min"),
   ....:     max_height=("height", "max"),
   ....:     average_weight=("weight", np.mean),
   ....: )
   ....: 
Out[91]: 
      min_height  max_height  average_weight
kind                                        
cat          9.1         9.5            8.90
dog          6.0        34.0          102.75
서로 다른 열 은 서로 다른 집합 방법 을 지정 합 니 다.
agg 방법 으로 사전 을 전송 하면 서로 다른 열 을 지정 하여 서로 다른 집합 을 사용 할 수 있 습 니 다.

In [95]: grouped.agg({"C": "sum", "D": "std"})
Out[95]: 
            C         D
A                      
bar  0.392940  1.366330
foo -1.796421  0.884785
변환 조작
변환 은 대상 을 같은 크기 의 대상 으로 바 꾸 는 작업 입 니 다.데이터 분석 과정 에서 데이터 변환 작업 이 자주 필요 하 다.
lambda 작업 연결 가능:

In [112]: ts.groupby(lambda x: x.year).transform(lambda x: x.max() - x.min())
나 값 채 우기:

In [121]: transformed = grouped.transform(lambda x: x.fillna(x.mean()))
여과 작업
filter 방법 은 lambda 표현 식 을 통 해 우리 가 필요 하지 않 은 데 이 터 를 걸 러 낼 수 있 습 니 다.

In [136]: sf = pd.Series([1, 1, 2, 3, 3, 3])

In [137]: sf.groupby(sf).filter(lambda x: x.sum() > 2)
Out[137]: 
3    3
4    3
5    3
dtype: int64
조작 적용
일부 데 이 터 는 취 합 이나 전환 작업 에 적합 하지 않 을 수 있 습 니 다.Pandas 는 4.567914.방법 을 제공 하여 더욱 유연 한 전환 작업 을 할 수 있 습 니 다.

In [156]: df
Out[156]: 
     A      B         C         D
0  foo    one -0.575247  1.346061
1  bar    one  0.254161  1.511763
2  foo    two -1.143704  1.627081
3  bar  three  0.215897 -0.990582
4  foo    two  1.193555 -0.441652
5  bar    two -0.077118  1.211526
6  foo    one -0.408530  0.268520
7  foo  three -0.862495  0.024580

In [157]: grouped = df.groupby("A")

# could also just call .describe()
In [158]: grouped["C"].apply(lambda x: x.describe())
Out[158]: 
A         
bar  count    3.000000
     mean     0.130980
     std      0.181231
     min     -0.077118
     25%      0.069390
                ...   
foo  min     -1.143704
     25%     -0.862495
     50%     -0.575247
     75%     -0.408530
     max      1.193555
Name: C, Length: 16, dtype: float64
외부 접속 가능 함수:

In [159]: grouped = df.groupby('A')['C']

In [160]: def f(group):
   .....:     return pd.DataFrame({'original': group,
   .....:                          'demeaned': group - group.mean()})
   .....: 

In [161]: grouped.apply(f)
Out[161]: 
   original  demeaned
0 -0.575247 -0.215962
1  0.254161  0.123181
2 -1.143704 -0.784420
3  0.215897  0.084917
4  1.193555  1.552839
5 -0.077118 -0.208098
6 -0.408530 -0.049245
7 -0.862495 -0.503211
본문 은 이미 수록 되 었 다.http://www.flydean.com/11-python-pandas-groupby/
가장 통속 적 인 해석,가장 깊 은 건어물,가장 간결 한 튜 토리 얼,당신 이 모 르 는 작은 기술 들 이 당신 을 기다 리 고 있 습 니 다!
Pandas 고급 튜 토리 얼 의 Pandas 에 있 는 GroupBy 작업 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.Pandas GroupBy 용법 에 관 한 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기