import pandas as pd
import numpy as np
df = pd.read_csv('http://bit.ly/ds-korean-idol')

정렬

Index 별로 정렬

오름차순 정렬 df.sort_index()

df.sort_index()

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

내림차순 정렬 df.sort_index(ascending=False)

df.sort_index(ascending=False)

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260

Column별로 정렬

오름차순 정렬 df.sort_values(by='키')

df.sort_values(by='키')

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661

내림차순 정렬 df.sort_values(by='키', ascending=False)

df.sort_values(by='키', ascending=False)

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661

복수정렬 df.sort_values(by=['키','브랜드평판지수'], ascending=False)

df.sort_values(by=['키','브랜드평판지수'], ascending=False)

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661

선택

Column 선택 df['이름']

df['이름']

0       지민
1     지드래곤
2     강다니엘
3        뷔
4       화사
5       정국
6       민현
7       소연
8        진
9      하성운
10      태연
11     차은우
12      백호
13      JR
14      슈가
Name: 이름, dtype: object

범위선택

단순 index에 대한 범위 선택 df[:3]

df[:3]

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745

loc

df.loc[:, '이름']

0       지민
1     지드래곤
2     강다니엘
3        뷔
4       화사
5       정국
6       민현
7       소연
8        진
9      하성운
10      태연
11     차은우
12      백호
13      JR
14      슈가
Name: 이름, dtype: object
df.loc[3:8, ['이름', '생년월일']]

이름 생년월일
3 1995-12-30
4 화사 1995-07-23
5 정국 1997-09-01
6 민현 1995-08-09
7 소연 1998-08-26
8 1992-12-04

iloc (position으로 색인)

df.iloc[:, [0,2]]

이름 소속사
0 지민 빅히트
1 지드래곤 YG
2 강다니엘 커넥트
3 빅히트
4 화사 RBW
5 정국 빅히트
6 민현 플레디스
7 소연 큐브
8 빅히트
9 하성운 스타크루이엔티
10 태연 SM
11 차은우 판타지오
12 백호 플레디스
13 JR 플레디스
14 슈가 빅히트
df.iloc[1:5, 1:4]

그룹 소속사 성별
1 빅뱅 YG 남자
2 NaN 커넥트 남자
3 방탄소년단 빅히트 남자
4 마마무 RBW 여자

Boolean Indexing - 조건을 활용한 색인

df['키'] > 180

0     False
1     False
2     False
3     False
4     False
5     False
6      True
7     False
8     False
9     False
10    False
11     True
12    False
13    False
14    False
Name: 키, dtype: bool

Boolean Index로 받은 Index를 활용해서 True인 값만 색인해 낼 수 있다.

df[df['키'] < 170]

df[df['키'] < 170]

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489

df[df['키'] > 180]['이름']

df[df['키'] > 180]['이름']

6      민현
11    차은우
Name: 이름, dtype: object

df.loc[df['키']>180, '이름'] * 이 방법을 더 추천

df.loc[df['키']>180, '이름']

6      민현
11    차은우
Name: 이름, dtype: object
df.loc[ df['키'] > 180, ['이름', '키']]

이름
6 민현 182.3
11 차은우 183.0

isin을 활용한 색인

isin을 활용한 색인은 내가 조건을 걸고자 하는 값이 내가 정의한 list에 있을 때만 색인하려는 경우에 사용

my_condition = ['플레디스', 'SM']
df['소속사'].isin(my_condition)

0     False
1     False
2     False
3     False
4     False
5     False
6      True
7     False
8     False
9     False
10     True
11    False
12     True
13     True
14    False
Name: 소속사, dtype: bool
df.loc[ df['소속사'].isin(my_condition) ]

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
df.loc[df['소속사'].isin(my_condition), '소속사']

6     플레디스
10      SM
12    플레디스
13    플레디스
Name: 소속사, dtype: object

결측값 색인

  • info() 로 NaN 값, 즉 빠진 데이터가 어디에 있는지 쉽게 요약정보로 확인할 수 있습니다.
df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 8 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   이름       15 non-null     object 
 1   그룹       14 non-null     object 
 2   소속사      15 non-null     object 
 3   성별       15 non-null     object 
 4   생년월일     15 non-null     object 
 5   키        13 non-null     float64
 6   혈액형      15 non-null     object 
 7   브랜드평판지수  15 non-null     int64  
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB
  • Boolean 인덱싱으로 True가 return 되는 값이 NaN이라는 것을 알 수 있습니다.
df['그룹'].isnull()

0     False
1     False
2      True
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10    False
11    False
12    False
13    False
14    False
Name: 그룹, dtype: bool
  • NaN이 아닌 값에 대하여 Boolean 인덱싱
df['그룹'].notnull()

0      True
1      True
2     False
3      True
4      True
5      True
6      True
7      True
8      True
9      True
10     True
11     True
12     True
13     True
14     True
Name: 그룹, dtype: bool
  • NaN 값만 색출해내기
df['그룹'][df['그룹'].isnull()]

2    NaN
Name: 그룹, dtype: object
df.loc[df['그룹'].notnull(), ['키','혈액형']]

혈액형
0 173.6 A
1 177.0 A
3 178.0 AB
4 162.1 A
5 178.0 A
6 182.3 O
7 NaN B
8 179.2 O
9 167.1 A
10 NaN A
11 183.0 B
12 175.0 AB
13 176.0 O
14 174.0 O

복사

- 다음과 같이 복사하면 안된다.

new_df = df
new_df.head()

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
hex(id(new_df))
'0x12e1d98c730'
hex(id(df))
'0x12e1d98c730'

참조하고 있는 메모리 주소가 같음.

원본 데이터를 유지 시키고, 새로운 변수에 복사할 때는 copy()를 사용

df.copy()

copy_df = df.copy()
hex(id(copy_df))
'0x12e1b894340'

행, 열 추가

row의 추가

  • dictionary 형태의 데이터를 만들어 준다음 append() 함수를 사용하여 데이터를 추가할 수 있다. 반드시, ignore_index=True 옵션을 같이 추가해 주셔야 에러가 안난다.

  • 또한, append() 한 뒤 다시 df에 대입해줘야 변경한 값이 유지 됩니다.

df = df.append({'이름': '테디', '그룹': '테디그룹', '소속사': '끝내주는소속사', '성별': '남자', '생년월일': '1970-01-01', '키': 195.0, '혈액형': 'O', '브랜드평판지수': 12345678}, ignore_index=True)

column의 추가

df['국적'] = '대한민국'

만약, 값을 변경하고 싶다면, loc 함수를 활용해서 변경

df.loc[ df['이름']=='지드래곤', '국적'] = 'korea'
df.head()

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 국적
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 대한민국
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 korea
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 대한민국
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 대한민국
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 대한민국
df = pd.read_csv('https://bit.ly/ds-korean-idol')

통계값

통계치 요약 df.describe()

df.describe()

브랜드평판지수
count 13.000000 1.500000e+01
mean 175.792308 5.655856e+06
std 5.820576 2.539068e+06
min 162.100000 2.925442e+06
25% 174.000000 3.712344e+06
50% 177.000000 4.668615e+06
75% 179.200000 7.862214e+06
max 183.000000 1.052326e+07

산술이 가능한 수치형 데이터만 요약이 된걸 볼 수 있다.

최소 min, 최대 max

df['키'].min()
162.1
df['키'].max()
183.0

합계 sum

df['키'].sum()
2285.3

평균 mean

df['키'].mean()
175.7923076923077

중앙값 median

df['키'].median()
177.0

최빈값 mode

df['키'].mode()
0    178.0
dtype: float64

분산 var, 표준편차 std

분산은 편차 제곱의 평균

표준편차는 분산의 루트

df['키'].var()
33.879102564102595
df['키'].std()
5.820575793175672

갯수 count

df['키'].count()
13

피벗테이블 (pivot_table)

  • 피벗테이블은 엑셀의 피벗테이블과 동일
  • 데이터 열 중에서 두 개의 열을 각각 행 인덱스, 열 인덱스로 사용하여 데이터를 조회하여 펼쳐놓은 것을 의미
  • 왼쪽에 나타나는 인덱스를 행 인덱스, 상단에 나타나는 인덱스를 열 인덱스라고 부른다
pd.pivot_table(df, index='소속사', columns = '혈액형', values='키')

혈액형 A AB B O
소속사
RBW 162.1 NaN NaN NaN
YG 177.0 NaN NaN NaN
빅히트 175.8 178.0 NaN 176.60
스타크루이엔티 167.1 NaN NaN NaN
커넥트 180.0 NaN NaN NaN
판타지오 NaN NaN 183.0 NaN
플레디스 NaN 175.0 NaN 179.15

aggfunc에는 추가 계산 옵션 (np.sum, np.mean) - 기본값은 평균

pd.pivot_table(df, index = '그룹', columns = '혈액형', values = '브랜드평판지수', aggfunc = np.sum)# 코드를 입력해 주세요

혈액형 A AB B O
그룹
뉴이스트 NaN 3301654.0 NaN 8263929.0
마마무 7650928.0 NaN NaN NaN
방탄소년단 15731595.0 8073501.0 NaN 7495750.0
빅뱅 9916947.0 NaN NaN NaN
소녀시대 3918661.0 NaN NaN NaN
아스트로 NaN NaN 3506027.0 NaN
아이들 NaN NaN 4668615.0 NaN
핫샷 4036489.0 NaN NaN NaN

그룹별 통계(groupby)

  • groupby는 데이터를 그룹으로 묶어 분석할 때 활용한다.

groupby와 함께

  • count() - 갯수
  • sum() - 합계
  • mean() - 평균
  • var() - 분산
  • std() - 표준편차
  • min()/max() - 최소값, 최대값
df.groupby('소속사').count()

이름 그룹 성별 생년월일 혈액형 브랜드평판지수
소속사
RBW 1 1 1 1 1 1 1
SM 1 1 1 1 0 1 1
YG 1 1 1 1 1 1 1
빅히트 5 5 5 5 5 5 5
스타크루이엔티 1 1 1 1 1 1 1
커넥트 1 0 1 1 1 1 1
큐브 1 1 1 1 0 1 1
판타지오 1 1 1 1 1 1 1
플레디스 3 3 3 3 3 3 3

산술 통계는 자동으로 산술통계가 가능한 열만 출력됩니다.

df.groupby('그룹').mean()

브랜드평판지수
그룹
뉴이스트 177.766667 3.855194e+06
마마무 162.100000 7.650928e+06
방탄소년단 176.560000 6.260169e+06
빅뱅 177.000000 9.916947e+06
소녀시대 NaN 3.918661e+06
아스트로 183.000000 3.506027e+06
아이들 NaN 4.668615e+06
핫샷 167.100000 4.036489e+06

특정 열만 출력하고 싶다면?

df.groupby('그룹')['키'].mean()

그룹
뉴이스트     177.766667
마마무      162.100000
방탄소년단    176.560000
빅뱅       177.000000
소녀시대            NaN
아스트로     183.000000
아이들             NaN
핫샷       167.100000
Name: 키, dtype: float64

Multi-Index(복합 인덱스)

Multi-Index 적용

행 인덱스를 복합적으로 구성하고 싶은 경우는 인덱스를 리스트로 만들어 줍니다.

df.groupby(['혈액형','성별']).mean()

브랜드평판지수
혈액형 성별
A 남자 175.140 7591755.20
여자 162.100 5784794.50
AB 남자 176.500 5687577.50
B 남자 183.000 3506027.00
여자 NaN 4668615.00
O 남자 177.875 3939919.75

Multi-Index 데이터 프레임을 피벗 테이블로 변환

Multi-Index로 된 데이터프레임을 피벗테이블 형태로 다시 변환해 줄 수 있습니다.

df2 = df.groupby(['혈액형','성별']).mean()
df2.unstack('혈액형')

브랜드평판지수
혈액형 A AB B O A AB B O
성별
남자 175.14 176.5 183.0 177.875 7591755.2 5687577.5 3506027.0 3939919.75
여자 162.10 NaN NaN NaN 5784794.5 NaN 4668615.0 NaN
df2.unstack('성별')

브랜드평판지수
성별 남자 여자 남자 여자
혈액형
A 175.140 162.1 7591755.20 5784794.5
AB 176.500 NaN 5687577.50 NaN
B 183.000 NaN 3506027.00 4668615.0
O 177.875 NaN 3939919.75 NaN

인덱스 초기화 (reset_index)

reset_index() 는 Multi-Index로 구성된 데이터 프레임의 인덱스를 초기화해 줍니다

df2

브랜드평판지수
혈액형 성별
A 남자 175.140 7591755.20
여자 162.100 5784794.50
AB 남자 176.500 5687577.50
B 남자 183.000 3506027.00
여자 NaN 4668615.00
O 남자 177.875 3939919.75
df2 = df2.reset_index()
df2

혈액형 성별 브랜드평판지수
0 A 남자 175.140 7591755.20
1 A 여자 162.100 5784794.50
2 AB 남자 176.500 5687577.50
3 B 남자 183.000 3506027.00
4 B 여자 NaN 4668615.00
5 O 남자 177.875 3939919.75

전처리

결측값 채우기 fillna()

fillna(): na 값에 대하여 fill해주는 함수입니다.

df['키']

0     173.6
1     177.0
2     180.0
3     178.0
4     162.1
5     178.0
6     182.3
7       NaN
8     179.2
9     167.1
10      NaN
11    183.0
12    175.0
13    176.0
14    174.0
Name: 키, dtype: float64
df['키'].fillna(-1)

0     173.6
1     177.0
2     180.0
3     178.0
4     162.1
5     178.0
6     182.3
7      -1.0
8     179.2
9     167.1
10     -1.0
11    183.0
12    175.0
13    176.0
14    174.0
Name: 키, dtype: float64

키의 NaN 값을 채워준다음 유지시키려면 inplace=True 옵션을 주거나, fillna로 채워 준 값을 다시 대입해 주어야 합니다.

df2['키'] = df2['키'].fillna(-1)

빈 값(NaN)이 있는 행을 제거

df

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
df.dropna()

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

axis (열/ 행을 드랍)

axis=0은 행을 드랍합니다.

df.dropna(axis=0)

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

axis=1은 열을 드랍합니다.

df.dropna(axis=1)

이름 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 빅히트 남자 1995-10-13 A 10523260
1 지드래곤 YG 남자 1988-08-18 A 9916947
2 강다니엘 커넥트 남자 1996-12-10 A 8273745
3 빅히트 남자 1995-12-30 AB 8073501
4 화사 RBW 여자 1995-07-23 A 7650928
5 정국 빅히트 남자 1997-09-01 A 5208335
6 민현 플레디스 남자 1995-08-09 O 4989792
7 소연 큐브 여자 1998-08-26 B 4668615
8 빅히트 남자 1992-12-04 O 4570308
9 하성운 스타크루이엔티 남자 1994-03-22 A 4036489
10 태연 SM 여자 1989-03-09 A 3918661
11 차은우 판타지오 남자 1997-03-30 B 3506027
12 백호 플레디스 남자 1995-07-21 AB 3301654
13 JR 플레디스 남자 1995-06-08 O 3274137
14 슈가 빅히트 남자 1993-03-09 O 2925442

how옵션 - 'any': 한개라도 있는 경우 드랍, 'all'은 모두 NaN인 경우 드랍

df.dropna()

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
df.dropna(axis=0, how='any')

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
df.dropna(axis=0, how='all')

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

중복된 값 제거 (drop_duplicates)

column의 중복값 제거

df['키']

0     173.6
1     177.0
2     180.0
3     178.0
4     162.1
5     178.0
6     182.3
7       NaN
8     179.2
9     167.1
10      NaN
11    183.0
12    175.0
13    176.0
14    174.0
Name: 키, dtype: float64
df['키'].drop_duplicates()

0     173.6
1     177.0
2     180.0
3     178.0
4     162.1
6     182.3
7       NaN
8     179.2
9     167.1
11    183.0
12    175.0
13    176.0
14    174.0
Name: 키, dtype: float64

keep 옵션으로 유지하고 싶은 데이터를 선택할 수 있습니다. keep: 'first' / 'last'

df['키'].drop_duplicates(keep='last')

0     173.6
1     177.0
2     180.0
4     162.1
5     178.0
6     182.3
8     179.2
9     167.1
10      NaN
11    183.0
12    175.0
13    176.0
14    174.0
Name: 키, dtype: float64

행 전체 제거

df.drop_duplicates('그룹')

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
df.drop_duplicates(keep='last')

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

Drop - column/row 제거하기

df.head()

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928

column 제거하기

drop()을 활용하여 column을 제거할 수 있습니다. column을 제거할 때는 axis=1 옵션을 줍니다.

df.drop('그룹', axis=1)

이름 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 커넥트 남자 1996-12-10 180.0 A 8273745
3 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 큐브 여자 1998-08-26 NaN B 4668615
8 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 SM 여자 1989-03-09 NaN A 3918661
11 차은우 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 빅히트 남자 1993-03-09 174.0 O 2925442
df.drop(['그룹','소속사'], axis=1)

이름 성별 생년월일 혈액형 브랜드평판지수
0 지민 남자 1995-10-13 173.6 A 10523260
1 지드래곤 남자 1988-08-18 177.0 A 9916947
2 강다니엘 남자 1996-12-10 180.0 A 8273745
3 남자 1995-12-30 178.0 AB 8073501
4 화사 여자 1995-07-23 162.1 A 7650928
5 정국 남자 1997-09-01 178.0 A 5208335
6 민현 남자 1995-08-09 182.3 O 4989792
7 소연 여자 1998-08-26 NaN B 4668615
8 남자 1992-12-04 179.2 O 4570308
9 하성운 남자 1994-03-22 167.1 A 4036489
10 태연 여자 1989-03-09 NaN A 3918661
11 차은우 남자 1997-03-30 183.0 B 3506027
12 백호 남자 1995-07-21 175.0 AB 3301654
13 JR 남자 1995-06-08 176.0 O 3274137
14 슈가 남자 1993-03-09 174.0 O 2925442

row 제거하기

drop()을 활용하여 row를 제거할 수 있습니다. row를 제거할 때는 제거하고자하는 index와 axis=0 옵션을 줍니다.

df.drop(3, axis=0)

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

복수의 row를 제거하고자 할 때는 list로 지정합니다.

df.drop([3,5], axis=0)

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

조건을 만족하는 행 제거

df.drop(df.loc[df['키'] > 180].index)
이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

DataFrame 합치기 (concat)

df2 = pd.read_csv('https://bit.ly/ds-korean-idol-2')

row 기준 합치기

df_copy = df.copy()

row에 합칠 때는 pd.concat에 합칠 데이터프레임을 list로 합쳐줍니다. row 기준으로 합칠 때는 sort=False 옵션을 주어 순서가 유지되도록 합니다.

df_concat =pd.concat([df, df_copy], sort=False)
df_concat

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

꼬인 인덱스는 reset_index()를 이용하여 인덱스를 초기화 해줍니다.

하지만, index라는 column이 추가 됩니다. 그럴때는 drop=True 옵션으로 새로 index column이 생성되지 않도록 만들어 줍니다

df_concat.reset_index(drop=True)

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
15 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
16 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
17 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
18 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
19 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
20 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
21 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
22 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
23 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
24 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
25 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
26 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
27 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
28 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
29 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

column 기준으로 합치기

column을 기준으로 합치고자 할 때는 axis=1 옵션을 부여합니다

pd.concat([df, df2], axis=1)

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 이름 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 지민 3000 3
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 지드래곤 3500 3
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 강다니엘 3200 4
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 3050 4
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 화사 4300 3
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 정국 2900 5
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 민현 3400 6
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 소연 4500 5
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200 4
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 하성운 4300 4
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 태연 3700 3
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 차은우 3850 5
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 백호 3900 4
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 JR 4100 3
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 슈가 4150 3

행의 갯수가 맞지 않는 상태에서 column concat

df3 = df2.drop([3,5])
pd.concat([df, df3], axis=1)

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 이름 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 지민 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 지드래곤 3500.0 3.0
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 강다니엘 3200.0 4.0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 NaN NaN NaN
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 화사 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 NaN NaN NaN
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 민현 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 소연 4500.0 5.0
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 하성운 4300.0 4.0
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 태연 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 차은우 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 백호 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 JR 4100.0 3.0
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 슈가 4150.0 3.0

DataFrame 병합하기 (merge)

이전에 봤던 concat과 merge는 단순 합치는 목적과 특정 기준(index)으로 합치느냐에 따라 용도가 다릅니다.

  • concat: row나 column 기준으로 단순하게 이어 붙히기
  • merge: 특정 고유한 키(unique id) 값을 기준으로 병합하기

pd.merge(left, right, on='기준column', how='left')

  • left와 right는 병합할 두 DataFrame을 대입합니다.
  • on 에는 병합의 기준이 되는 column을 넣어 줍니다.
  • how 에는 'left', 'right', 'inner', 'outer' 라는 4가지의 병합 방식중 한가지를 택합니다.

left, right 방식

df2 에서 5개의 데이터를 고의적으로 drop한 데이터

df_right = df2.drop([1, 3, 5, 7, 9], axis=0)
df_right = df_right.reset_index(drop=True)

df_right

이름 연봉 가족수
0 지민 3000 3
1 강다니엘 3200 4
2 화사 4300 3
3 민현 3400 6
4 4200 4
5 태연 3700 3
6 차은우 3850 5
7 백호 3900 4
8 JR 4100 3
9 슈가 4150 3
df

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442

병합할 2개의 DataFrame의 행의 갯수가 맞지 않습니다. 실 사례에서도 충분히 있을 법한 일입니다.

'left' 옵션을 부여하면, left DataFrame에 키 값이 존재하면 해당 데이터를 유지하고, 병합한 right DataFrame의 값의 NaN이 대입 됩니다.

pd.merge(df, df_right, on='이름', how = 'left')

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 NaN NaN
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 3200.0 4.0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 NaN NaN
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 NaN NaN
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 NaN NaN
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 NaN NaN
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 4100.0 3.0
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 4150.0 3.0

반대로 'right' 옵션을 부여하면 right DataFrame을 기준으로 병합하게 됩니다.

pd.merge(df, df_right, on = '이름', how='right')

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 3000 3
1 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 3200 4
2 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4300 3
3 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 3400 6
4 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200 4
5 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 3700 3
6 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 3850 5
7 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 3900 4
8 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 4100 3
9 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 4150 3

inner, outer 방식

  • inner 방식은 두 DataFrame에 모두 키 값이 존재하는 경우만 병합합니다.
  • outer 방식은 하나의 DataFrame에 키 값이 존재하는 경우 모두 병합합니다.
  • outer 방식에서는 없는 값은 NaN으로 대입됩니다.
df

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
df_right

이름 연봉 가족수
0 지민 3000 3
1 강다니엘 3200 4
2 화사 4300 3
3 민현 3400 6
4 4200 4
5 태연 3700 3
6 차은우 3850 5
7 백호 3900 4
8 JR 4100 3
9 슈가 4150 3
pd.merge(df, df_right, on='이름', how='inner')

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 3000 3
1 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 3200 4
2 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4300 3
3 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 3400 6
4 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200 4
5 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 3700 3
6 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 3850 5
7 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 3900 4
8 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 4100 3
9 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 4150 3
pd.merge(df, df_right, on='이름', how='outer')

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 NaN NaN
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 3200.0 4.0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 NaN NaN
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 NaN NaN
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 NaN NaN
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 NaN NaN
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 4100.0 3.0
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 4150.0 3.0

column명은 다르지만, 동일한 성질의 데이터 인 경우

df

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
df_right.columns = ['성함', '연봉', '가족수']

df_right

성함 연봉 가족수
0 지민 3000 3
1 강다니엘 3200 4
2 화사 4300 3
3 민현 3400 6
4 4200 4
5 태연 3700 3
6 차은우 3850 5
7 백호 3900 4
8 JR 4100 3
9 슈가 4150 3

df와 df_right를 병합하려고 했더니, df에서는 '이름', df_right에서는 '성함'으로 표기되어 기준이 되는 column을 지정할 수 없습니다.

이럴 때는 left_on, right_on 옵션을 사용합니다.

pd.merge(df, df_right, left_on='이름', right_on='성함', how='outer')

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 성함 연봉 가족수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 지민 3000.0 3.0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 NaN NaN NaN
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 강다니엘 3200.0 4.0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 NaN NaN NaN
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 화사 4300.0 3.0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 NaN NaN NaN
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 민현 3400.0 6.0
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 NaN NaN NaN
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 4200.0 4.0
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 NaN NaN NaN
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 태연 3700.0 3.0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 차은우 3850.0 5.0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 백호 3900.0 4.0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 JR 4100.0 3.0
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 슈가 4150.0 3.0

Series의 Type 변환하기

type 확인하기

df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 8 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   이름       15 non-null     object 
 1   그룹       14 non-null     object 
 2   소속사      15 non-null     object 
 3   성별       15 non-null     object 
 4   생년월일     15 non-null     object 
 5   키        13 non-null     float64
 6   혈액형      15 non-null     object 
 7   브랜드평판지수  15 non-null     int64  
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB

이전에 배운 info를 찍어보면, 우측에 type이 같이 찍히는 것을 확인하실 수 있습니다.

  • object: 일반 문자열 타입
  • float: 실수
  • int: 정수
  • category: 카테고리
  • datetime: 시간

type 변환하기

  • type 변환을 위해서는 astype이라는 메소드를 사용합니다.
df['키'].dtypes

dtype('float64')
df['키'].astype(int)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-98-143bd2af1410> in <module>
      1 #collapse-output
----> 2 df['키'].astype(int)

~\anaconda3\lib\site-packages\pandas\core\generic.py in astype(self, dtype, copy, errors)
   5875         else:
   5876             # else, only a single dtype is given
-> 5877             new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors)
   5878             return self._constructor(new_data).__finalize__(self, method="astype")
   5879 

~\anaconda3\lib\site-packages\pandas\core\internals\managers.py in astype(self, dtype, copy, errors)
    629         self, dtype, copy: bool = False, errors: str = "raise"
    630     ) -> "BlockManager":
--> 631         return self.apply("astype", dtype=dtype, copy=copy, errors=errors)
    632 
    633     def convert(

~\anaconda3\lib\site-packages\pandas\core\internals\managers.py in apply(self, f, align_keys, ignore_failures, **kwargs)
    425                     applied = b.apply(f, **kwargs)
    426                 else:
--> 427                     applied = getattr(b, f)(**kwargs)
    428             except (TypeError, NotImplementedError):
    429                 if not ignore_failures:

~\anaconda3\lib\site-packages\pandas\core\internals\blocks.py in astype(self, dtype, copy, errors)
    671             vals1d = values.ravel()
    672             try:
--> 673                 values = astype_nansafe(vals1d, dtype, copy=True)
    674             except (ValueError, TypeError):
    675                 # e.g. astype_nansafe can fail on object-dtype of strings

~\anaconda3\lib\site-packages\pandas\core\dtypes\cast.py in astype_nansafe(arr, dtype, copy, skipna)
   1066 
   1067         if not np.isfinite(arr).all():
-> 1068             raise ValueError("Cannot convert non-finite values (NA or inf) to integer")
   1069 
   1070     elif is_object_dtype(arr):

ValueError: Cannot convert non-finite values (NA or inf) to integer

에러가 발생했습니다..NaN 값이 들어있기 때문에 변경이 안됩니다.

이럴 때는 fillna로 빈값을 임의로 채워 주겠습니다.

df['키'] = df['키'].fillna(-1)
df['키'].astype(int)

0     173
1     177
2     180
3     178
4     162
5     178
6     182
7      -1
8     179
9     167
10     -1
11    183
12    175
13    176
14    174
Name: 키, dtype: int32

int형으로 타입을 바꾸니 float -> int로 변경 된 것을 볼 수 있습니다.

날짜 변환하기 (datetime 타입)

  • 날짜를 변환하기 위해서는 판다스 메소드인 to_datetime이라는 메소드를 사용합니다.

현재 날짜 column은 dtype:이 object, 즉 문자열 타입으로 되어 있습니다.

df['생년월일']

0     1995-10-13
1     1988-08-18
2     1996-12-10
3     1995-12-30
4     1995-07-23
5     1997-09-01
6     1995-08-09
7     1998-08-26
8     1992-12-04
9     1994-03-22
10    1989-03-09
11    1997-03-30
12    1995-07-21
13    1995-06-08
14    1993-03-09
Name: 생년월일, dtype: object
df['생년월일'] = pd.to_datetime(df['생년월일'])

datetime 타입으로 우리가 변환해준 중요한 이유가 있습니다!

  • 매우 손쉽게, 월, 일, 요일 등등의 날짜 정보를 세부적으로 추출해낼 수 있습니다.
  • datetime의 약어인 'dt'에는 다양한 정보들을 제공해 줍니다.
df['생년월일'].dt.year

0     1995
1     1988
2     1996
3     1995
4     1995
5     1997
6     1995
7     1998
8     1992
9     1994
10    1989
11    1997
12    1995
13    1995
14    1993
Name: 생년월일, dtype: int64
df['생년월일'].dt.month

0     10
1      8
2     12
3     12
4      7
5      9
6      8
7      8
8     12
9      3
10     3
11     3
12     7
13     6
14     3
Name: 생년월일, dtype: int64
df['생년월일'].dt.day

0     13
1     18
2     10
3     30
4     23
5      1
6      9
7     26
8      4
9     22
10     9
11    30
12    21
13     8
14     9
Name: 생년월일, dtype: int64
df['생년월일'].dt.hour

0     0
1     0
2     0
3     0
4     0
5     0
6     0
7     0
8     0
9     0
10    0
11    0
12    0
13    0
14    0
Name: 생년월일, dtype: int64
df['생년월일'].dt.minute

0     0
1     0
2     0
3     0
4     0
5     0
6     0
7     0
8     0
9     0
10    0
11    0
12    0
13    0
14    0
Name: 생년월일, dtype: int64
df['생년월일'].dt.second

0     0
1     0
2     0
3     0
4     0
5     0
6     0
7     0
8     0
9     0
10    0
11    0
12    0
13    0
14    0
Name: 생년월일, dtype: int64
df['생년월일'].dt.dayofweek

0     4
1     3
2     1
3     5
4     6
5     0
6     2
7     2
8     4
9     1
10    3
11    6
12    4
13    3
14    1
Name: 생년월일, dtype: int64

월요일: 0 화요일: 1, 수요일: 2, 목요일: 3, 금요일: 4, 토요일: 5, 일요일: 6

df['생년월일'].dt.weekofyear

<ipython-input-110-2428c4b5ec27>:2: FutureWarning: Series.dt.weekofyear and Series.dt.week have been deprecated.  Please use Series.dt.isocalendar().week instead.
  df['생년월일'].dt.weekofyear
0     41
1     33
2     50
3     52
4     29
5     36
6     32
7     35
8     49
9     12
10    10
11    13
12    29
13    23
14    10
Name: 생년월일, dtype: int64

apply

apply는 Series나 DataFrame에 좀 더 구체적인 로직을 적용하고 싶은 경우 활용합니다.

  • apply를 적용하기 위해서는 함수가 먼저 정의되어야합니다.
  • apply는 정의한 로직 함수를 인자로 넘겨줍니다.
df.loc[df['성별'] == '남자', '성별'] = 1
df.loc[df['성별'] == '여자', '성별'] = 0
df

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 1 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 1 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 1 1996-12-10 180.0 A 8273745
3 방탄소년단 빅히트 1 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 0 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 1 1997-09-01 178.0 A 5208335
6 민현 뉴이스트 플레디스 1 1995-08-09 182.3 O 4989792
7 소연 아이들 큐브 0 1998-08-26 -1.0 B 4668615
8 방탄소년단 빅히트 1 1992-12-04 179.2 O 4570308
9 하성운 핫샷 스타크루이엔티 1 1994-03-22 167.1 A 4036489
10 태연 소녀시대 SM 0 1989-03-09 -1.0 A 3918661
11 차은우 아스트로 판타지오 1 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 1 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 1 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 1 1993-03-09 174.0 O 2925442
  • (목표) 남자/ 여자의 문자열 데이터로 구성된 '성별' column을 1 / 0 으로 바꿔보세요
df = pd.read_csv('http://bit.ly/ds-korean-idol')

[주의] 반드시 return 값이 존재하여야합니다.

남자: 1 여자: 0 기타: -1

def male_or_female(x):
    if x == '남자':
        return 1
    elif x == '여자':
        return 0
df['성별_NEW'] = df['성별'].apply(male_or_female)
df.head()

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 성별_NEW
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 1
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 1
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 1
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 1
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 0
  • (목표) cm당 브랜드 평판지수를 구해보세요 (브랜드평판지수/ 키)
def cm_to_brand(df):
    value = df['브랜드평판지수'] / df['키']
    return value
df.apply(cm_to_brand, axis=1)

0     60617.857143
1     56027.949153
2     45965.250000
3     45356.747191
4     47198.815546
5     29260.308989
6     27371.321997
7              NaN
8     25503.950893
9     24156.128067
10             NaN
11    19158.617486
12    18866.594286
13    18603.051136
14    16812.885057
dtype: float64

lambda 함수의 적용

  • lambda는 1줄로 작성하는 간단 함수식입니다.
  • return을 별도로 명기하지 않습니다
f = lambda x: 1 if x == '남자' else 0
df['성별'].apply(f)

0     1
1     1
2     1
3     1
4     0
5     1
6     1
7     0
8     1
9     1
10    0
11    1
12    1
13    1
14    1
Name: 성별, dtype: int64

실제로는 간단한 계산식을 적용하려는 경우에 많이 사용합니다.

df['키/2'] = df['키'].apply(lambda x: x / 2)
df.head()

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 성별_NEW 키/2
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 1 86.80
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 1 88.50
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 1 90.00
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 1 89.00
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 0 81.05
df['키'].apply(lambda x: x ** 2)
0     30136.96
1     31329.00
2     32400.00
3     31684.00
4     26276.41
5     31684.00
6     33233.29
7          NaN
8     32112.64
9     27922.41
10         NaN
11    33489.00
12    30625.00
13    30976.00
14    30276.00
Name: 키, dtype: float64

apply에 함수식을 만들어서 적용해주는 것과 동일하기 때문에, 복잡한 조건식은 함수로 간단한 계산식은 lambda로 적용할 수 있습니다.

map - 값을 매핑

my_map = {
    '남자': 1,
    '여자': 0
}
df['성별'].map(my_map)

0     1
1     1
2     1
3     1
4     0
5     1
6     1
7     0
8     1
9     1
10    0
11    1
12    1
13    1
14    1
Name: 성별, dtype: int64
my_map = {
    '남자': 'male',
    '여자': 'female'
}
df['성별'].map(my_map)

0       male
1       male
2       male
3       male
4     female
5       male
6       male
7     female
8       male
9       male
10    female
11      male
12      male
13      male
14      male
Name: 성별, dtype: object

데이터프레임의 산술 연산

df = pd.DataFrame({'통계': [60, 70, 80, 85, 75], '미술': [50, 55, 80, 100, 95], '체육': [70, 65, 50, 95, 100] })

Column 과 Column 간 연산 (+, -, *, /, %)

type(df['통계'])
pandas.core.series.Series
df['통계'] + df['미술'] + df['체육']

0    180
1    190
2    210
3    280
4    270
dtype: int64
df['통계'] - df['미술']

0    10
1    15
2     0
3   -15
4   -20
dtype: int64
df['통계'] * df['미술']

0    3000
1    3850
2    6400
3    8500
4    7125
dtype: int64
df['통계'] / df['미술']

0    1.200000
1    1.272727
2    1.000000
3    0.850000
4    0.789474
dtype: float64
df['통계'] % df['미술']

0    10
1    15
2     0
3    85
4    75
dtype: int64

Column 과 숫자 간 연산 (+, -, *, /, %)

df['통계'] + 10

0    70
1    80
2    90
3    95
4    85
Name: 통계, dtype: int64

복합 연산

df = pd.DataFrame({'통계': [60, 70, 80, 85, 75], '미술': [50, 55, 80, 100, 95], '체육': [70, 65, 50, 95, 100] })
df['통계미술합계'] = df['통계'] + df['미술'] + 10
df

통계 미술 체육 통계미술합계
0 60 50 70 120
1 70 55 65 135
2 80 80 50 170
3 85 100 95 195
4 75 95 100 180

mean(), sum()을 axis 기준으로 연산

df = pd.DataFrame({'통계': [60, 70, 80, 85, 75], '미술': [50, 55, 80, 100, 95], '체육': [70, 65, 50, 95, 100] })
df.sum(axis=0) # == df.sum()

통계    370
미술    380
체육    380
dtype: int64
df.mean(axis=0) # == df.mean()

통계    74.0
미술    76.0
체육    76.0
dtype: float64
df.sum(axis=1)

0    180
1    190
2    210
3    280
4    270
dtype: int64
df.mean(axis=1)

0    60.000000
1    63.333333
2    70.000000
3    93.333333
4    90.000000
dtype: float64

NaN 값이 존재할 경우 연산

df = pd.DataFrame({'통계': [60, 70, np.nan , 85, 75], '미술': [50, np.nan , 80, 100, 95], '체육': [70, 65, 50, np.nan , 100] })
df['통계'] / 2

0    30.0
1    35.0
2     NaN
3    42.5
4    37.5
Name: 통계, dtype: float64
1000 / df['통계'] 

0    16.666667
1    14.285714
2          NaN
3    11.764706
4    13.333333
Name: 통계, dtype: float64
df['통계'] / np.nan

0   NaN
1   NaN
2   NaN
3   NaN
4   NaN
Name: 통계, dtype: float64
np.nan / df['통계']

0   NaN
1   NaN
2   NaN
3   NaN
4   NaN
Name: 통계, dtype: float64

DataFrame 과 DataFrame 간 연산

df1 = pd.DataFrame({'통계': [60, 70, 80, 85, 75], '미술': [50, 55, 80, 100, 95], '체육': [70, 65, 50, 95, 100] })
df2 = pd.DataFrame({'통계': ['good', 'bad', 'ok' , 'good', 'ok'], '미술': [50, 60 , 80, 100, 95], '체육': [70, 65, 50, 70 , 100] })

문자열이 포함된 DataFrame의 경우

df1 + df2

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py in _na_arithmetic_op(left, right, op, is_cmp)
    141     try:
--> 142         result = expressions.evaluate(op, left, right)
    143     except TypeError:

~\anaconda3\lib\site-packages\pandas\core\computation\expressions.py in evaluate(op, a, b, use_numexpr)
    234             # error: "None" not callable
--> 235             return _evaluate(op, op_str, a, b)  # type: ignore[misc]
    236     return _evaluate_standard(op, op_str, a, b)

~\anaconda3\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_numexpr(op, op_str, a, b)
    119     if result is None:
--> 120         result = _evaluate_standard(op, op_str, a, b)
    121 

~\anaconda3\lib\site-packages\pandas\core\computation\expressions.py in _evaluate_standard(op, op_str, a, b)
     68     with np.errstate(all="ignore"):
---> 69         return op(a, b)
     70 

TypeError: unsupported operand type(s) for +: 'int' and 'str'

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-151-8f6622453dfa> in <module>
      1 #collapse-output
----> 2 df1 + df2

~\anaconda3\lib\site-packages\pandas\core\ops\common.py in new_method(self, other)
     63         other = item_from_zerodim(other)
     64 
---> 65         return method(self, other)
     66 
     67     return new_method

~\anaconda3\lib\site-packages\pandas\core\arraylike.py in __add__(self, other)
     87     @unpack_zerodim_and_defer("__add__")
     88     def __add__(self, other):
---> 89         return self._arith_method(other, operator.add)
     90 
     91     @unpack_zerodim_and_defer("__radd__")

~\anaconda3\lib\site-packages\pandas\core\frame.py in _arith_method(self, other, op)
   5980         self, other = ops.align_method_FRAME(self, other, axis, flex=True, level=None)
   5981 
-> 5982         new_data = self._dispatch_frame_op(other, op, axis=axis)
   5983         return self._construct_result(new_data)
   5984 

~\anaconda3\lib\site-packages\pandas\core\frame.py in _dispatch_frame_op(self, right, func, axis)
   6016             #  _frame_arith_method_with_reindex
   6017 
-> 6018             bm = self._mgr.operate_blockwise(right._mgr, array_op)
   6019             return type(self)(bm)
   6020 

~\anaconda3\lib\site-packages\pandas\core\internals\managers.py in operate_blockwise(self, other, array_op)
    372         Apply array_op blockwise with another (aligned) BlockManager.
    373         """
--> 374         return operate_blockwise(self, other, array_op)
    375 
    376     def apply(

~\anaconda3\lib\site-packages\pandas\core\internals\ops.py in operate_blockwise(left, right, array_op)
     52     res_blks: List["Block"] = []
     53     for lvals, rvals, locs, left_ea, right_ea, rblk in _iter_block_pairs(left, right):
---> 54         res_values = array_op(lvals, rvals)
     55         if left_ea and not right_ea and hasattr(res_values, "reshape"):
     56             res_values = res_values.reshape(1, -1)

~\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py in arithmetic_op(left, right, op)
    187     else:
    188         with np.errstate(all="ignore"):
--> 189             res_values = _na_arithmetic_op(lvalues, rvalues, op)
    190 
    191     return res_values

~\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py in _na_arithmetic_op(left, right, op, is_cmp)
    147             #  will handle complex numbers incorrectly, see GH#32047
    148             raise
--> 149         result = _masked_arith_op(left, right, op)
    150 
    151     if is_cmp and (is_scalar(result) or result is NotImplemented):

~\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py in _masked_arith_op(x, y, op)
     89         if mask.any():
     90             with np.errstate(all="ignore"):
---> 91                 result[mask] = op(xrav[mask], yrav[mask])
     92 
     93     else:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

column의 순서가 바뀌어 있는 경우

df1 = pd.DataFrame({'미술': [10, 20, 30, 40, 50], '통계':[60, 70, 80, 90, 100] })
df2 = pd.DataFrame({'통계': [10, 20, 30, 40, 50], '미술': [60, 70, 80, 90, 100] })
df1 + df2

미술 통계
0 70 70
1 90 90
2 110 110
3 130 130
4 150 150

행의 갯수가 다른경우

df1 = pd.DataFrame({'미술': [10, 20, 30, 40, 50, 60], '통계':[60, 70, 80, 90, 100, 110] })
df2 = pd.DataFrame({'통계': [10, 20, 30, 40, 50], '미술': [60, 70, 80, 90, 100] })
df1 * df2

미술 통계
0 600.0 600.0
1 1400.0 1400.0
2 2400.0 2400.0
3 3600.0 3600.0
4 5000.0 5000.0
5 NaN NaN
df = pd.read_csv('https://bit.ly/ds-korean-idol')

데이터 타입별 column 선택 (select_dtypes)

df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 8 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   이름       15 non-null     object 
 1   그룹       14 non-null     object 
 2   소속사      15 non-null     object 
 3   성별       15 non-null     object 
 4   생년월일     15 non-null     object 
 5   키        13 non-null     float64
 6   혈액형      15 non-null     object 
 7   브랜드평판지수  15 non-null     int64  
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB

문자열이 있는 column 만 선택

df.select_dtypes(include='object')

이름 그룹 소속사 성별 생년월일 혈액형
0 지민 방탄소년단 빅히트 남자 1995-10-13 A
1 지드래곤 빅뱅 YG 남자 1988-08-18 A
2 강다니엘 NaN 커넥트 남자 1996-12-10 A
3 방탄소년단 빅히트 남자 1995-12-30 AB
4 화사 마마무 RBW 여자 1995-07-23 A
5 정국 방탄소년단 빅히트 남자 1997-09-01 A
6 민현 뉴이스트 플레디스 남자 1995-08-09 O
7 소연 아이들 큐브 여자 1998-08-26 B
8 방탄소년단 빅히트 남자 1992-12-04 O
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 A
10 태연 소녀시대 SM 여자 1989-03-09 A
11 차은우 아스트로 판타지오 남자 1997-03-30 B
12 백호 뉴이스트 플레디스 남자 1995-07-21 AB
13 JR 뉴이스트 플레디스 남자 1995-06-08 O
14 슈가 방탄소년단 빅히트 남자 1993-03-09 O
df.select_dtypes(exclude='object')

브랜드평판지수
0 173.6 10523260
1 177.0 9916947
2 180.0 8273745
3 178.0 8073501
4 162.1 7650928
5 178.0 5208335
6 182.3 4989792
7 NaN 4668615
8 179.2 4570308
9 167.1 4036489
10 NaN 3918661
11 183.0 3506027
12 175.0 3301654
13 176.0 3274137
14 174.0 2925442
num_cols = df.select_dtypes(exclude='object').columns
obj_cols = df.select_dtypes(include='object').columns
df[obj_cols]

이름 그룹 소속사 성별 생년월일 혈액형
0 지민 방탄소년단 빅히트 남자 1995-10-13 A
1 지드래곤 빅뱅 YG 남자 1988-08-18 A
2 강다니엘 NaN 커넥트 남자 1996-12-10 A
3 방탄소년단 빅히트 남자 1995-12-30 AB
4 화사 마마무 RBW 여자 1995-07-23 A
5 정국 방탄소년단 빅히트 남자 1997-09-01 A
6 민현 뉴이스트 플레디스 남자 1995-08-09 O
7 소연 아이들 큐브 여자 1998-08-26 B
8 방탄소년단 빅히트 남자 1992-12-04 O
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 A
10 태연 소녀시대 SM 여자 1989-03-09 A
11 차은우 아스트로 판타지오 남자 1997-03-30 B
12 백호 뉴이스트 플레디스 남자 1995-07-21 AB
13 JR 뉴이스트 플레디스 남자 1995-06-08 O
14 슈가 방탄소년단 빅히트 남자 1993-03-09 O

원핫인코딩 (One-hot-encoding)

  • 원핫인코딩은 한개의 요소는 True 그리고 나머지 요소는 False로 만들어 주는 기법입니다.
  • 원핫인코딩은 왜 필요할까요?
blood_map = {
    'A': 0, 
    'B': 1,
    'AB': 2, 
    'O': 3,
}
df['혈액형_code'] = df['혈액형'].map(blood_map)
df.head()

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 혈액형_code
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 0
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 2
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 0
df['혈액형_code'].value_counts()

0    7
3    4
1    2
2    2
Name: 혈액형_code, dtype: int64
  • 우리가 만약 df['혈액형_code']를 머신러닝 알고리즘에 그대로 넣어 데이터를 예측하라고 지시한다면, 컴퓨터는 '혈액형_code'안에서 값들간의 관계를 스스로 형성하게 됩니다.
  • 이 상황에서 만약 B형은 1, AB형은 2라는 값을 가지고 있는데, 컴퓨터는 B형 + AB형 = O형이다라고 잘못 관계를 맺을 수 있게 됩니다.
  • 따라서, 우리는 4개의 별도의 column을 형성해주고 1개의 column에는 True 나머지는 모두 False를 넣어 줌으로써 A, B, AB, O형의 관계는 독립적이다를 표현해줍니다.
  • 이를 원핫인코딩이라고 합니다.
df['혈액형_code']

0     0
1     0
2     0
3     2
4     0
5     0
6     3
7     1
8     3
9     0
10    0
11    1
12    2
13    3
14    3
Name: 혈액형_code, dtype: int64
pd.get_dummies(df['혈액형_code'])

0 1 2 3
0 1 0 0 0
1 1 0 0 0
2 1 0 0 0
3 0 0 1 0
4 1 0 0 0
5 1 0 0 0
6 0 0 0 1
7 0 1 0 0
8 0 0 0 1
9 1 0 0 0
10 1 0 0 0
11 0 1 0 0
12 0 0 1 0
13 0 0 0 1
14 0 0 0 1

prefix를 설정하려면?

pd.get_dummies(df['혈액형_code'], prefix='혈액형')

혈액형_0 혈액형_1 혈액형_2 혈액형_3
0 1 0 0 0
1 1 0 0 0
2 1 0 0 0
3 0 0 1 0
4 1 0 0 0
5 1 0 0 0
6 0 0 0 1
7 0 1 0 0
8 0 0 0 1
9 1 0 0 0
10 1 0 0 0
11 0 1 0 0
12 0 0 1 0
13 0 0 0 1
14 0 0 0 1
pd.get_dummies(df, columns = ['혈액형_code'])

이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 혈액형_code_0 혈액형_code_1 혈액형_code_2 혈액형_code_3
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 1 0 0 0
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947 1 0 0 0
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745 1 0 0 0
3 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501 0 0 1 0
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 1 0 0 0
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335 1 0 0 0
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 0 0 0 1
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615 0 1 0 0
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 0 0 0 1
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 1 0 0 0
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661 1 0 0 0
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027 0 1 0 0
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654 0 0 1 0
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137 0 0 0 1
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442 0 0 0 1

시각화

import matplotlib.pyplot as plt
%matplotlib inline

import platform

if platform.system() == 'Darwin': # Mac 환경 폰트 설정
    plt.rc('font', family='AppleGothic')
elif platform.system() == 'Windows': # Windows 환경 폰트 설정
    plt.rc('font', family='Malgun Gothic')

plt.rc('axes', unicode_minus=False) # 마이너스 폰트 설정

%config InlineBackend.figure_format = 'retina'
df = pd.read_csv('https://bit.ly/ds-house-price-clean')
df.plot()

<AxesSubplot:>

Graph Size

plt.rcParams["figure.figsize"] = (12, 9)
df.plot()

<AxesSubplot:>

Plot 그래프

plot은 일반 선그래프를 나타냅니다.

kind 옵션을 통해 원하는 그래프를 그릴 수 있습니다.

kind 옵션:

  • line: 선그래프
  • bar: 바 그래프
  • barh: 수평 바 그래프
  • hist: 히스토그램
  • kde: 커널 밀도 그래프
  • hexbin: 고밀도 산점도 그래프
  • box: 박스 플롯
  • area: 면적 그래프
  • pie: 파이 그래프
  • scatter: 산점도 그래프

line 그래프

  • line 그래프는 데이터가 연속적인 경우 사용하기 적절합니다. (예를 들면, 주가 데이터)
df['분양가'].plot(kind='line')

<AxesSubplot:>
df_seoul = df.loc[df['지역'] == '서울']
df_seoul

지역 규모 연도 분양가
0 서울 60㎡이하 2015 10 5652
1 서울 60㎡초과 85㎡이하 2015 10 5882
2 서울 85㎡초과 102㎡이하 2015 10 5721
3 서울 102㎡초과 2015 10 5879
64 서울 60㎡이하 2015 11 6320
... ... ... ... ... ...
3178 서울 102㎡초과 2020 1 8779
3234 서울 60㎡이하 2020 2 8193
3235 서울 60㎡초과 85㎡이하 2020 2 8140
3236 서울 85㎡초과 102㎡이하 2020 2 13835
3237 서울 102㎡초과 2020 2 9039

212 rows × 5 columns

df_seoul_year = df_seoul.groupby('연도').mean()
df_seoul_year

분양가
연도
2015 11.0 6201.000000
2016 6.5 6674.520833
2017 6.5 6658.729167
2018 6.5 7054.687500
2019 6.5 8735.083333
2020 1.5 9647.375000
df_seoul_year['분양가'].plot(kind='line')

<AxesSubplot:xlabel='연도'>

bar 그래프

bar 그래프는 그룹별로 비교할 때 유용합니다.

df.groupby('지역')['분양가'].mean()

지역
강원    2448.156863
경기    4133.952830
경남    2858.932367
경북    2570.465000
광주    3055.043750
대구    3679.620690
대전    3176.127389
부산    3691.981132
서울    7308.943396
세종    2983.543147
울산    2990.373913
인천    3684.302885
전남    2326.250000
전북    2381.416268
제주    3472.677966
충남    2534.950000
충북    2348.183962
Name: 분양가, dtype: float64
df.groupby('지역')['분양가'].mean().plot(kind='bar')

<AxesSubplot:xlabel='지역'>
df.groupby('지역')['분양가'].mean().plot(kind='barh')

<AxesSubplot:ylabel='지역'>

히스토그램 (hist)

히스토그램은 분포-빈도 를 시각화하여 보여줍니다

가로축에는 분포를, 세로축에는 빈도가 시각화되어 보여집니다.

df['분양가'].plot(kind='hist')

<AxesSubplot:ylabel='Frequency'>

커널 밀도 그래프

  • 히스토그램과 유사하게 밀도를 보여주는 그래프입니다.
  • 히스토그램과 유사한 모양새를 갖추고 있습니다.
  • 부드러운 라인을 가지고 있습니다.
df['분양가'].plot(kind='kde')

<AxesSubplot:ylabel='Density'>

Hexbin

  • hexbin은 고밀도 산점도 그래프입니다.
  • x와 y 키 값을 넣어 주어야 합니다.
  • x, y 값 모두 numeric 한 값을 넣어 주어야합니다.
  • 데이터의 밀도를 추정합니다.
df.plot(kind='hexbin', x='분양가', y='연도', gridsize=20)

<AxesSubplot:xlabel='분양가', ylabel='연도'>

박스 플롯(box)

df_seoul = df.loc[df['지역'] == '서울']
df_seoul['분양가'].plot(kind='box')

<AxesSubplot:>
df_seoul.describe()

연도 분양가
count 212.00000 212.000000 212.000000
mean 2017.45283 6.566038 7308.943396
std 1.31439 3.603629 1402.869496
min 2015.00000 1.000000 5061.000000
25% 2016.00000 3.000000 6519.750000
50% 2017.00000 7.000000 6895.500000
75% 2019.00000 10.000000 7732.000000
max 2020.00000 12.000000 13835.000000

area plot

area plot은 line 그래프에서 아래 area를 모두 색칠해 주는 것이 특징입니다.

df.groupby('월')['분양가'].count().plot(kind='line')

<AxesSubplot:xlabel='월'>
df.groupby('월')['분양가'].count().plot(kind='area')

<AxesSubplot:xlabel='월'>

pie plot (파이 그래프)

pie는 대표적으로 데이터의 점유율을 보여줄 때 유용합니다.

df.groupby('연도')['분양가'].count().plot(kind='pie')

<AxesSubplot:ylabel='분양가'>

scatter plot (산점도 그래프)

  • 점으로 데이터를 표기해 줍니다
  • x, y 값을 넣어주어야합니다 (hexbin과 유사)
  • x축과 y축을 지정해주면 그에 맞는 데이터 분포도를 볼 수 있습니다.
  • 역시 numeric 한 column 만 지정할 수 있습니다
df.plot(x='월', y='분양가', kind='scatter')

<AxesSubplot:xlabel='월', ylabel='분양가'>