본문 바로가기

AI인공지능 by Python/3. 데이터 분석

[ AI 인공지능 ] ② 판다스(Pandas) _ 2

9. 데이터 복사

new_df = df

new_df.head()
  name group company gender birthday height blood brand
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
new_df['name'] = '김사과'
new_df.head()
  name group company gender birthday height blood brand
0 김사과 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 김사과 빅뱅 YG 남자 1988-08-18 177 A 9916947
2 김사과 NaN 커넥트 남자 1996-12-10 180 A 8273745
3 김사과 방탄소년단 빅히트 남자 1995-12-30 178 AB 8073501
4 김사과 마마무 RBW 여자 1995-07-23 162.1 A 7650928
df.head()
  name group company gender birthday height blood brand
0 김사과 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 김사과 빅뱅 YG 남자 1988-08-18 177 A 9916947
2 김사과 NaN 커넥트 남자 1996-12-10 180 A 8273745
3 김사과 방탄소년단 빅히트 남자 1995-12-30 178 AB 8073501
4 김사과 마마무 RBW 여자 1995-07-23 162.1 A 7650928
print(hex(id(new_df))) # 16진수 형태(hex)의 메모리 주소(id)를 반환
print(hex(id(df)))

0x7ff282c8aa60
0x7ff282c8aa60

df = pd.read_csv('http://bit.ly/ds-korean-idol')
df
  이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178 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 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174 O 2925442
copy_df['이름'] = '반하나'
copy_df.head()
  이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 반하나 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 반하나 빅뱅 YG 남자 1988-08-18 177 A 9916947
2 반하나 NaN 커넥트 남자 1996-12-10 180 A 8273745
3 반하나 방탄소년단 빅히트 남자 1995-12-30 178 AB 8073501
4 반하나 마마무 RBW 여자 1995-07-23 162.1 A 7650928
df.head()
  이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928

 

10. 행, 열 추가 및 삭제하기

10-1. 행추가 

  • dict 형태의 데이터를 만들어주고, append() 함수를 사용하여 데이터를 추가
  • 반드시 ignore_index = True 옵션을 추가해야 에러가 나지 않음
df.append({'이름':'김사과', '그룹':'애플', '소속사':'apple', '성별':'여자', '생년월일':'2000-01-01',
           '키':160, '혈액형':'A', '브랜드평판지수':987654321}, ignore_index = True)

<ipython-input-92a93c25bea859>:1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
  df.append({'이름':'김사과', '그룹':'애플', '소속사':'apple', '성별':'여자', '생년월일':'2000-01-01',

  이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180 A 8273745
3 방탄소년단 빅히트 남자 1995-12-30 178 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
5 정국 방탄소년단 빅히트 남자 1997-09-01 178 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 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174 O 2925442
15
김사과 애플 apple 여자 2000-01-01 160 A 987654321
df.tail()
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174 O 2925442
df = df.append({'이름':'김사과', '그룹':'애플', '소속사':'apple', '성별':'여자', '생년월일':'2000-01-01',
           '키':160, '혈액형':'A', '브랜드평판지수':987654321}, ignore_index = True)
           
df.tail()
11 차은우 아스트로 판타지오 남자 1997-03-30 183 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174 O 2925442
15
김사과 애플 apple 여자 2000-01-01 160 A 987654321

 

10-2. 열 추가

df['국적'] = '대한민국' # 파생변수
df.head()
  이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 국적
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 대한민국
1 지드래곤 빅뱅 YG 남자 1988-08-18 177 A 9916947 대한민국
2 강다니엘 NaN 커넥트 남자 1996-12-10 180 A 8273745 대한민국
3 방탄소년단 빅히트 남자 1995-12-30 178 AB 8073501 대한민국
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 대한민국
df.tail()
  이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 국적
11 차은우 아스트로 판타지오 남자 1997-03-30 183 B 3506027 대한민국
12 백호 뉴이스트 플레디스 남자 1995-07-21 175 AB 3301654 대한민국
13 JR 뉴이스트 플레디스 남자 1995-06-08 176 O 3274137 대한민국
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174 O 2925442 대한민국
15
김사과 애플 apple 여자 2000-01-01 160 A 987654321 대한민국
df.loc[df['이름'] == '김사과', '국적'] = '미국'

df.tail()
  이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 국적
11 차은우 아스트로 판타지오 남자 1997-03-30 183 B 3506027 대한민국
12 백호 뉴이스트 플레디스 남자 1995-07-21 175 AB 3301654 대한민국
13 JR 뉴이스트 플레디스 남자 1995-06-08 176 O 3274137 대한민국
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174 O 2925442 대한민국
15
김사과 애플 apple 여자 2000-01-01 160 A 987654321 미국

 

11. 통계값 다루기

df['키'].sum()

> 2445.3

df['키'].count() # Null값 빠짐

> 14

df['키'].mean()

> 174.66428571428574

df['키'].max()

> 183.0 

 

✔️ 분산 : 데이터가 평균으로부터 얼마나 떨어져 있는지 정도

                   (데이터 - 평균) **2 을 모두 더한 값 / 데이터 개수

✔️ 표준편차 : 분산에 루트 씌운 값

import numpy as np

data = np.array([1,3,5,7,9])

✔️분산

print(((1-5)**2 + (3-5)**2 + (5-5)**2 + (7-5)**2 + (9-5)**2) / 5)

data.var()

> 8.0

 

✔️ 표준편차

print(np.sqrt(((1-5)**2 + (3-5)**2 + (5-5)**2 + (7-5)**2 + (9-5) **2) / 5))

data.std()

> 2.8284271247461903

 

12. 그룹으로 묶기

  • groupby() : 데이터 그룹으로 묶어 분석할 때 사용
df.groupby('소속사')

> <pandas.core.groupby.generic.DataFrameGroupBy object at 0x7ff282b6c460>

df.groupby('소속사').count()
  이름 그룹 성별 생년월일 혈액형 브랜드평판지수 국적
소속사                
RBW 1 1 1 1 1 1 1 1
SM 1 1 1 1 0 1 1 1
YG 1 1 1 1 1 1 1 1
apple 1 1 1 1 1 1 1 1
빅히트 5 5 5 5 5 5 5 5
스타크루이엔티 1 1 1 1 1 1 1 1
커넥트 1 0 1 1 1 1 1 1
큐브 1 1 1 1 0 1 1 1
판타지오 1 1 1 1 1 1 1 1
플레디스 3 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
애플 160.000000  9.876543e+08
핫샷 167.100000 4.036489e+06
df.groupby('그룹').sum()
  브랜드평판지수
그룹    
뉴이스트 533.3 1565583
마마무 162.1 7650928
방탄소년단 882.8 31300846
빅뱅 177.0 9916947
소녀시대 0.0  3918661
아스트로 183.0 3506027
아이들 0.0 4668615
애플 160.0 987654321
핫샷 167.1 4036489
df.groupby('성별').mean()
  브랜드평판지수
성별    
남자 176.933333  5.716636e+06
여자 161.050000  2.509731e+08

 

☑️ 혈액형별로 그룹을 맺어 키의 평균값 확인

df.groupby('혈액형')['키'].mean()

혈액형
A     171.114286
AB    176.500000
B     183.000000
O     177.875000
Name: 키, dtype: float64

 

☑️ 혈액형별로 그룹을 맺고, 성별로 또 그룹을 나눈 후 키의 평균값 확인

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

혈액형  성별
A    남자    175.140
     여자    161.050
AB   남자    176.500
B    남자    183.000
     여자        NaN
O    남자    177.875
Name: 키, dtype: float64

 

13. 결측값 채우기

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
15    160.0
Name: 키, dtype: float64

 

✔️ fillna() : 결측값을 채워주는 함수

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
15    160.0
Name: 키, dtype: float64

df2 = df.copy()
df2.head()

# 두 가지 방법
df2['키'] = df2['키'].fillna(-1)

df2['키'].fillna(-1, inplace = True)
df2
  이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 국적
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 대한민국
1 지드래곤 빅뱅 YG 남자 1988-08-18 177 A 9916947 대한민국
2 강다니엘 NaN 커넥트 남자 1996-12-10 180 A 8273745 대한민국
3 방탄소년단 빅히트 남자 1995-12-30 178 AB 8073501 대한민국
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 대한민국
5 정국 방탄소년단 빅히트 남자 1997-09-01 178 A 5208335 대한민국
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792 대한민국
7 소연 아이들 큐브 여자 1998-08-26 -1 B 4668615 대한민국
8 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308 대한민국
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489 대한민국
10 태연 소녀시대 SM 여자 1989-03-09 -1 A 3918661 대한민국
11 차은우 아스트로 판타지오 남자 1997-03-30 183 B 3506027 대한민국
12 백호 뉴이스트 플레디스 남자 1995-07-21 175 AB 3301654 대한민국
13 JR 뉴이스트 플레디스 남자 1995-06-08 176 O 3274137 대한민국
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174 O 2925442 대한민국
15 김사과 애플 apple 여자 2000-01-01 160 A 987654321 미국
height = df2['키'].mean()
height

> 152.70625

 

✔️ 결측값이 있는 행을 제거

       결측값이 한개라도 있는 경우 행을 삭제 df.dropna(axis = 0, how = 'any)

df.dropna()
  이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 국적
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 대한민국
1 지드래곤 빅뱅 YG 남자 1988-08-18 177 A 9916947 대한민국
2 강다니엘 NaN 커넥트 남자 1996-12-10 180 A 8273745 대한민국
3 방탄소년단 빅히트 남자 1995-12-30 178 AB 8073501 대한민국
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 대한민국
5 정국 방탄소년단 빅히트 남자 1997-09-01 178 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 B 3506027 대한민국
12 백호 뉴이스트 플레디스 남자 1995-07-21 175 AB 3301654 대한민국
13 JR 뉴이스트 플레디스 남자 1995-06-08 176 O 3274137 대한민국
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174 O 2925442 대한민국
15 김사과 애플 apple 여자 2000-01-01 160 A 987654321 미국

 

✔️ 결측값이 있는 열을 제거

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 대한민국
15 김사과 apple 여자 2000-01-01 A 987654321 미국
df.iloc[15] = np.nan # nan삽입
df.tail()
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 대한민국
15 NaN NaN NaN NaN NaN NaN NaN

 

✔️ 행의 데이터가 모두 NaN인 경우만 삭제

df.dropna(axis = 0, how = 'all', inplace = True)
df
  이름 그룹 소속사 성별 생년월일 혈액형 브랜드평판지수 국적
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260 대한민국
1 지드래곤 빅뱅 YG 남자 1988-08-18 177 A 9916947 대한민국
2 강다니엘 NaN 커넥트 남자 1996-12-10 180 A 8273745 대한민국
3 방탄소년단 빅히트 남자 1995-12-30 178 AB 8073501 대한민국
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928 대한민국
5 정국 방탄소년단 빅히트 남자 1997-09-01 178 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 B 3506027 대한민국
12 백호 뉴이스트 플레디스 남자 1995-07-21 175 AB 3301654 대한민국
13 JR 뉴이스트 플레디스 남자 1995-06-08 176 O 3274137 대한민국
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174 O 2925442 대한민국