데이터분석/Python Pandas

<python pandas> Grouping Data 데이터 그룹화하기

창조적생각 2021. 8. 19. 11:32

<목차>

 

1. value_counts

 

2. 공통된 데이터를 기준으로 그룹화하기

groupby

 

3. 활용 [코로나 확진자 여행지별 증감율]

 

 오늘은 pandas로 가져온 데이터에서 column 안에 있는 데이터의 수를 세고, 공통 인자를 기준으로 묶어서 분석하는 법에 대해서 알아보겠습니다.

 

 알아보기 위해 오늘은 공공데이터를 활용하겠습니다.

 

 공공데이터 포털에서 서울시 코로나19 확진자 현황.csv를 사용하겠습니다. 

 

 

받은 직후에 바로 pandas에서 읽어오려고 하면 encoding 문제가 뜹니다. 별별 인코딩들을 다 써봤지만 안열려서, 그냥 엑셀로 열어서 엑셀에서 다시 csv 파일로 저장해서 읽어왔습니다...

 

각설하고, 시작하겠습니다.

 

변수 이름을 df로 하고 csv 파일을 불러옵니다. csv 파일 이름은 '서울시 코로나19 확진자 현황.csv' 이 맞습니다만 앞에서의 투쟁으로 인해 무엇인가 많이 변해버린 이름입니다...

 

info()를 활용해서 혹시 수정해야 할 데이터형이 있나, 데이터의 크기는 얼마인가 확인을 해봅니다.

 

1. column안에 공통된 데이터의 숫자 세기

 

df['column 이름'].value_counts()

 

df['column 이름'].value_counts()를 사용하면 column 안에서 공통된 데이터들의 수를 세고 그 수가 각각 얼마인지를 보여줍니다.

 

코로나 확진자들이 여행을 어디를 다녀왔나 확인하고 싶으시다면,

 

df['여행력'].value_counts()

 

어느 지역에 얼마의 확진자가 발생했는가를 확인하고 싶으시다면

 

df['지역'].value_counts()

그리고 그 비율을 알고 싶다면 narmailize = True를 사용해주시면 됩니다.

 

df['지역'].value_counts(normalize = True)

2. column 내의 공통된 데이터를 기준으로 그룹화하기 groupby

 

column 내의 공통된 데이터를 기준으로 그룹화하는 방법을 알아보겠습니다.

 

두가지 방법이 있습니다.

1.groupby를 사용하는 것과 2. 필터를 사용하는 방법이 있습니다.

 

먼저 groupby를 사용하는 방법은

 

df.groupby(['기준이 될 column 이름'])

 

을 이용하면 됩니다.

 

그리고 그 안에서 원하는 데이터가 들어있는 row를 검색하기 위해서는

 

get._group('원하는 데이터')

 

를 작성해주시면됩니다.

저는 country_grp를 변수로 하고 ['여행력'] 안의 데이터를 기준으로 그룹화 해 보겠습니다.

그리고 그 안에서 중국이 들어간 row를 꺼내 보겠습니다.

 

country_grp = df.groupby(['여행력'])

country_grp.get._group('원하는 데이터')

 

필터를 사용해 주기 위해서는 필터를 작성해서 검색해 주시면 됩니다.

이전에 한번 다룬 적이 있어 넘어가도록하겠습니다.

여행을 다녀온 곳들을 기준으로 어떤 지역의 확진자들이 얼마나 많이 그 나라에 다녀왔는지 알아보겠습니다.

그렇게 하기 위해서는 

우선 다녀온 여행지별로 분류된 country_grp에서 ['지역'] column 안의 value 들의 수를 알아내면 되겠죠.

그래서

 

country_grp['지역'].value_counts

 

를 작성하시면 됩니다.

 

그중에서 50개만 뽑아보겠습니다.

 

또 그 중에서 중국에 다녀온 데이터만 알고 싶다면 뒤에 .loc['중국']을 넣어주시면 됩니다.

 

3. 활용

 

아래는 여행력에 따른 2020의 확진자 수와 2021 확진자 수의 증감률을 표시해보는 연습입니다.

모든 코드는 가장 아래에 작성해 놓겠습니다.

긴 글 읽어주셔서 감사합니다.

[전체 코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import pandas as pd
df = pd.read_csv("seoul_corona_now - seoul_corona_now.csv")
df
df.info()
 
#columns내의 value의 숫자 구분해서 세기
df['여행력'].value_counts()
df['지역'].value_counts()
#비율 구하기
df['지역'].value_counts(normalize = True)
 
#groupby 구별
country_grp = df.groupby(['여행력'])
country_grp.get_group('중국')
#필터로 구별
filt = df['여행력'== '중국'
df.loc[filt]
 
#각 구별법 별 검색방법
df.loc[filt]['지역'].value_counts()
country_grp['지역'].value_counts().head(50)
country_grp['지역'].value_counts().loc['중국']
country_grp['지역'].value_counts(normalize = True).loc['중국']
 
# 2020~ 2021년 여행지별 확진자 증감
_2020_valdi = country_grp['확진일'].apply(lambda x : x.str.contains('2020').sum())
_2021_valdi = country_grp['확진일'].apply(lambda x : x.str.contains('2021').sum())
 
valdi = pd.concat([_2020_valdi,_2021_valdi],axis = 'columns',sort = False)
valdi
valdi.columns = ['2020확진자''2021확진자']
valdi
valdi['증가율'= (valdi['2021확진자'- valdi['2020확진자'])/valdi['2020확진자'*100
valdi.loc['중국']
valdi.loc['미국']
valdi.loc['유럽']
 
cs
728x90