pandas 그룹 그룹과agg 집합의 실례

12768 단어 pandasgroupagg
다음과 같습니다.

import pandas as pd
 
df = pd.DataFrame({'Country':['China','China', 'India', 'India', 'America', 'Japan', 'China', 'India'], 
     'Income':[10000, 10000, 5000, 5002, 40000, 50000, 8000, 5000],
     'Age':[5000, 4321, 1234, 4010, 250, 250, 4500, 4321]})
구성된 데이터는 다음과 같습니다.

 Age Country Income
0 5000 China 10000
1 4321 China 10000
2 1234 India 5000
3 4010 India 5002
4 250 America 40000
5 250 Japan 50000
6 4500 China 8000
7 4321 India 5000

그룹화


단일 열 그룹


df_gb = df.groupby('Country')
for index, data in df_gb:
 print(index)
 print(data)
출력

America
 Age Country Income
4 250 America 40000
China
 Age Country Income
0 5000 China 10000
1 4321 China 10000
6 4500 China 8000
India
 Age Country Income
2 1234 India 5000
3 4010 India 5002
7 4321 India 5000
Japan
 Age Country Income
5 250 Japan 50000

다중 열 그룹


df_gb = df.groupby(['Country', 'Income'])
for (index1, index2), data in df_gb:
 print((index1, index2))
 print(data)
출력

('America', 40000)
 Age Country Income
4 250 America 40000
('China', 8000)
 Age Country Income
6 4500 China 8000
('China', 10000)
 Age Country Income
0 5000 China 10000
1 4321 China 10000
('India', 5000)
 Age Country Income
2 1234 India 5000
7 4321 India 5000
('India', 5002)
 Age Country Income
3 4010 India 5002
('Japan', 50000)
 Age Country Income
5 250 Japan 50000

집합


그룹화 후 데이터 집합


기본적으로 그룹을 나눈 후 다른 열을 집합합니다

df_agg = df.groupby('Country').agg(['min', 'mean', 'max'])
print(df_agg)
출력

 Age     Income      
   min   mean max min   mean max
Country              
America 250 250.000000 250 40000 40000.000000 40000
China 4321 4607.000000 5000 8000 9333.333333 10000
India 1234 3188.333333 4321 5000 5000.666667 5002
Japan  250 250.000000 250 50000 50000.000000 50000

그룹화 후의 일부 열을 집합하다


일부 데이터에 대해 서로 다른 집합 작업만 하면 사전을 통해 구축할 수 있다

num_agg = {'Age':['min', 'mean', 'max']}
print(df.groupby('Country').agg(num_agg))
출력

 Age     
   min   mean max
Country       
America 250 250.000000 250
China 4321 4607.000000 5000
India 1234 3188.333333 4321
Japan  250 250.000000 250
num_agg = {'Age':['min', 'mean', 'max'], 'Income':['min', 'max']}
print(df.groupby('Country').agg(num_agg))
출력

  Age     Income  
   min   mean max min max
Country          
America 250 250.000000 250 40000 40000
China 4321 4607.000000 5000 8000 10000
India 1234 3188.333333 4321 5000 5002
Japan  250 250.000000 250 50000 50000
보충:pandas―매우 완전한 그룹by,agg, 표 데이터에 대한 그룹과 통계
나는 이 그룹비를 잘 쓰지 못한다.너무 복잡해.사실 실제로 자주 쓰는 것은 그 몇 개뿐이다.예를 들어 자주 쓰는 것을 거기에 넣으면 쉽게 이해하고 사용할 수 있다.나중에 한 편 더 쓰겠습니다.
그룹by 기능: 그룹
그룹by+agg(집합 함수들): 그룹을 나누면 각 그룹에 함수를 적용합니다. 예를 들어'sum','mean','max','min'...
그룹by 기본 세로 방향 그룹,axis=0

DataFrame
import pandas as pd
import numpy as np

 df = pd.DataFrame({'key1':['a', 'a', 'b', 'b', 'a'],
     'key2':['one', 'two', 'one', 'two', 'one'],
     'data1':np.random.randn(5),
     'data2':np.random.randn(5)})
print(df)

  data1  data2 key1 key2
0 -0.410122 0.247895 a one
1 -0.627470 -0.989268 a two
2 0.179488 -0.054570 b one
3 -0.299878 -1.640494 b two
4 -0.297191 0.954447 a one
그룹을 나누고 그룹을 교체합니다

list(df.groupby(['key1']))#list :[(group1),(group2),......]

[('a',  data1  data2 key1 key2
 0 -0.410122 0.247895 a one
 1 -0.627470 -0.989268 a two
 4 -0.297191 0.954447 a one), ('b',  data1  data2 key1 key2
 2 0.179488 -0.054570 b one
 3 -0.299878 -1.640494 b two)]
list 후 획득: [(group1), (group2),...]
모든 데이터 필름 (group) 형식: (name, group) 모듈
1. 키1(하나의 열)에 따라 그룹을 나눈다. 사실은 키1의 값에 따른다
그룹 by 대상은 교체를 지원하여 하나의 이원 그룹을 생성합니다. (그룹 이름, 데이터 블록), (그룹 이름, 데이터 블록)...

for name,group in df.groupby(['key1']):
 print(name)
 print(group)

a
  data1  data2 key1 key2
0 -0.410122 0.247895 a one
1 -0.627470 -0.989268 a two
4 -0.297191 0.954447 a one
b
  data1  data2 key1 key2
2 0.179488 -0.054570 b one
3 -0.299878 -1.640494 b two
2. [key1, key2](여러 열)로 그룹화
다중 키에 대해 생성된 1조 이원조: (k1, k2), 데이터 블록), (k1, k2), 데이터 블록)...
첫 번째 요소는 키 값으로 구성된 원조이다

for name,group in df.groupby(['key1','key2']):
 print(name) #name=(k1,k2)
 print(group)

('a', 'one')
  data1  data2 key1 key2
0 -0.410122 0.247895 a one
4 -0.297191 0.954447 a one
('a', 'two')
  data1  data2 key1 key2
1 -0.62747 -0.989268 a two
('b', 'one')
  data1 data2 key1 key2
2 0.179488 -0.05457 b one
('b', 'two')
  data1  data2 key1 key2
3 -0.299878 -1.640494 b two
3. 함수별 그룹
4. 사전별로 그룹화
5. 색인 레벨별로 그룹화
6. 함수를 수조, 목록, 사전, Series와 혼합하여 사용하는 것도 문제가 되지 않는다. 왜냐하면 모든 것이 결국 수조로 바뀌기 때문이다.
이 데이터 단편을 사전으로 만들다

dict(list(df.groupby(['key1'])))#dict(list())

{'a':  data1  data2 key1 key2
 0 -0.410122 0.247895 a one
 1 -0.627470 -0.989268 a two
 4 -0.297191 0.954447 a one, 'b':  data1  data2 key1 key2
 2 0.179488 -0.054570 b one
 3 -0.299878 -1.640494 b two}
조를 나누어 통계, 계산 등을 진행하다
1. 그룹을 나누면 그룹 크기가 있는 Series를 반환합니다.
키 1 로 그룹화

df.groupby(['key1']).size()

key1
a 3
b 2
dtype: int64

dict(['a1','x2','e3'])



{'a': '1', 'e': '3', 'x': '2'}
[key1, key2] 키를 눌러 그룹화

df.groupby(['key1','key2']).size()

key1 key2
a  one  2
  two  1
b  one  1
  two  1
dtype: int64
2. 데이터1을 키1에 따라 그룹화하고 데이터1열의 평균값을 계산한다

df['data1'].groupby(df['key1']).mean()
#groupby 。 

key1
a -0.444928
b -0.060195
Name: data1, dtype: float64

df.groupby(['key1'])['data1'].mean()# : df key1 , df['data1'] 
# :df.groupby(['key1']).data1.mean()

key1
a -0.444928
b -0.060195
Name: data1, dtype: float64
설명:
그룹비는 아무런 계산도 하지 않았습니다.그것은 단지 그룹을 나누었을 뿐이다.
데이터(Series)는 그룹 키에 따라 집합되어 새로운 Series가 생겼습니다. 색인은 키 1열의 유일한 값입니다.
이 인덱스 작업이 반환하는 대상은 그룹화된 DataFrame (목록이나 그룹으로 전송된 경우) 이나 그룹화된 Series

df.groupby(['key1'])['data1'].size()

key1
a 3
b 2
Name: data1, dtype: int64
3. 데이터1에 [key1, key2]를 눌러 그룹을 나누고 데이터1의 평균값을 계산한다

df['data1'].groupby([df['key1'],df['key2']]).mean()

key1 key2
a  one -0.353657
  two -0.627470
b  one  0.179488
  two -0.299878
Name: data1, dtype: float64

df.groupby(['key1','key2'])['data1'].mean()
# :df.groupby(['key1','key2']).data1'.mean()

key1 key2
a  one -0.353657
  two -0.627470
b  one  0.179488
  two -0.299878
Name: data1, dtype: float64
두 개의 키를 통해 데이터를 그룹화하여 얻은 Series는 하나의 차원화된 인덱스를 가지고 있다(유일한 키 쌍으로 구성).

df.groupby(['key1','key2'])['data1'].mean().unstack()
key2
one
two
key1
a
-0.353657
-0.627470
b
0.179488
-0.299878
위의 예에서 그룹 키는 모두 Series입니다.실제로 그룹 키는 길이가 적당한 그룹일 수 있다.매우 유연하다.
가로 방향
열의 데이터 형식(df.dtypes)에 따라 나누다
ff는 모두 두 가지 데이터 형식:float64와object로 나뉘기 때문에 두 그룹(dtype('float64'), (dtype('O'), 데이터)

list(df.groupby(df.dtypes, axis=1))

[(dtype('float64'),  data1  data2
 0 -0.410122 0.247895
 1 -0.627470 -0.989268
 2 0.179488 -0.054570
 3 -0.299878 -1.640494
 4 -0.297191 0.954447), (dtype('O'), key1 key2
 0 a one
 1 a two
 2 b one
 3 b two
 4 a one)]
agg의 응용
그룹by+agg는 그룹by의 결과에 여러 함수를 동시에 적용할 수 있다
SeriesGroupBy 메서드 agg() 매개변수:

aggregate(self, func_or_funcs, * args, ** kwargs)
func: function, string, dictionary, or list of string/functions
반환: aggregated Series

s= pd.Series([10,20,30,40])
s

0 10
1 20
2 30
3 40
dtype: int64

for n,g in s.groupby([1,1,2,2]):
 print(n)
 print(g)

0 10
1 20
dtype: int64
2
2 30
3 40
dtype: int64

s.groupby([1,1,2,2]).min()
1
1 10
2 30
dtype: int64

# :
s.groupby([1,1,2,2]).agg('min')

1 10
2 30
dtype: int64

s.groupby([1,1,2,2]).agg(['min','max'])# [],func 
min
max


이십

삼십
사십
자주 사용:dfdata1
data2
key1
key2
0
-0.410122
0.247895
a
one

-0.627470
-0.989268
a
two

0.179488
-0.054570
b
one

-0.299878
-1.640494
b
two

-0.297191
0.954447
a
one
아래를 비교해 보면 agg의 용도를 알 수 있다.

df.groupby(['key1'])['data1'].min()

key1
a -0.627470
b -0.299878
Name: data1, dtype: float64

df.groupby(['key1'])['data1'].agg({'min'})
min
key1
a
-0.627470
b
-0.299878

# √
df.groupby(['key1']).agg({'data1':'min'})# data1 , , data1
data1
key1
a
-0.627470
b
-0.299878

# key1 ,aggregate data1 :
df.groupby(['key1'])['data1'].agg({'min','max'})
max
min
key1
a
-0.297191
-0.627470
b
0.179488
-0.299878

# √
df.groupby(['key1']).agg({'data1':['min','max']})
data1
min
max
key1
a
-0.627470
-0.297191
b
-0.299878
0.179488
그룹비의 결과에 대해 열 이름을 수정할 수 있습니다 (이것을 추천하지 않습니다. 뒤에서 따로 열 이름을 바꾸더라도)

#  data1, min a,max b
df.groupby(['key1'])['data1'].agg({'a':'min','b':'max'})# 'min' 'max' 

d:\python27\lib\site-packages\ipykernel_launcher.py:2: FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version
a
b
key1
a
-0.627470
-0.297191
b
-0.299878
0.179488
중요 기교: 그룹비 이후 직접.reset_index () 는 다중 인덱스가 없는 DataFrame 을 얻을 수 있습니다.
이후에 df를 통과할 수 있습니다.rename({'old_col1':'new_col1','old_col2':'new_col2',...}) 이름 바꾸기
eg:

df1= df.groupby(['date'])['price'].agg({'sum','count'}).reset_index()
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기