별책 부록 2: <모두의 딥러닝 - 개정 3판>¶
데이터 분석을 위한 판다스¶
데이터 분석의 필수 라이브러리, 판다스(Pandas)¶
판다스(Pandas)는 데이터 분석과 관련된 다양한 기능을 제공하는 파이썬 라이브러리입니다. 데이터를 쉽게 조작하고 다룰 수 있도록 도와주기 때문에 딥러닝, 머신러닝을 스터디 하면 반드시 함께 배우게 됩니다. 판다스 매뉴얼과 판다스 홈페이지의 Cheat Sheet등을 조합해 가장 많이 쓰는 판다스 함수들을 모았습니다. 실전에서 바로 써먹는 92개의 판다스 공식을 확인해 보시기 바랍니다.
A. 데이터 만들기¶
In [1]:
Copied!
# 1. 판다스 라이브러리 불러오기
import pandas as pd
# 1. 판다스 라이브러리 불러오기
import pandas as pd
In [2]:
Copied!
# 2. 데이터 프레임 만들기
df = pd.DataFrame( # df라는 변수에 데이터 프레임을 담아 줍니다.
{"a" : [4 ,5, 6, 7], # 열 이름을 지정해 주고 시리즈 형태로 데이터를 저장합니다.
"b" : [8, 9, 10, 11],
"c" : [12, 13, 14, 15]},
index = [1, 2, 3, 4]) # 인덱스는 1,2,3으로 정해 줍니다.
# 2. 데이터 프레임 만들기
df = pd.DataFrame( # df라는 변수에 데이터 프레임을 담아 줍니다.
{"a" : [4 ,5, 6, 7], # 열 이름을 지정해 주고 시리즈 형태로 데이터를 저장합니다.
"b" : [8, 9, 10, 11],
"c" : [12, 13, 14, 15]},
index = [1, 2, 3, 4]) # 인덱스는 1,2,3으로 정해 줍니다.
In [3]:
Copied!
# 3. 데이터 프레임 출력
df
# 3. 데이터 프레임 출력
df
Out[3]:
| a | b | c | |
|---|---|---|---|
| 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 |
| 3 | 6 | 10 | 14 |
| 4 | 7 | 11 | 15 |
In [4]:
Copied!
# 4. 데이터의 열 이름을 따로 지정해서 만들기
df = pd.DataFrame(
[[4, 8, 12],
[5, 9, 13],
[6, 10, 14],
[7, 11, 15]],
index=[1, 2, 3, 4],
columns=['a', 'b', 'c']) # 열 이름을 따로 정해줄 수 있습니다.
df
# 4. 데이터의 열 이름을 따로 지정해서 만들기
df = pd.DataFrame(
[[4, 8, 12],
[5, 9, 13],
[6, 10, 14],
[7, 11, 15]],
index=[1, 2, 3, 4],
columns=['a', 'b', 'c']) # 열 이름을 따로 정해줄 수 있습니다.
df
Out[4]:
| a | b | c | |
|---|---|---|---|
| 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 |
| 3 | 6 | 10 | 14 |
| 4 | 7 | 11 | 15 |
In [5]:
Copied!
# 5. 인덱스가 두 개인 데이터 프레임 만들기
df = pd.DataFrame(
{"a" : [4 ,5, 6, 7],
"b" : [8, 9, 10, 11],
"c" : [12, 13, 14, 15]},
index = pd.MultiIndex.from_tuples( # 인덱스를 튜플로 지정합니다.
[('d', 1), ('d', 2), ('e', 1), ('e', 2)],
names=['n', 'v'])) # 인덱스 이름을 지정합니다.
df
# 5. 인덱스가 두 개인 데이터 프레임 만들기
df = pd.DataFrame(
{"a" : [4 ,5, 6, 7],
"b" : [8, 9, 10, 11],
"c" : [12, 13, 14, 15]},
index = pd.MultiIndex.from_tuples( # 인덱스를 튜플로 지정합니다.
[('d', 1), ('d', 2), ('e', 1), ('e', 2)],
names=['n', 'v'])) # 인덱스 이름을 지정합니다.
df
Out[5]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 | |
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
B. 데이터 정렬하기¶
In [6]:
Copied!
# 6. 특정 열의 값을 기준으로 정렬하기
df.sort_values('a', ascending=False) # ascending=False를 적어주면 역순으로 정렬합니다.
# 6. 특정 열의 값을 기준으로 정렬하기
df.sort_values('a', ascending=False) # ascending=False를 적어주면 역순으로 정렬합니다.
Out[6]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| e | 2 | 7 | 11 | 15 |
| 1 | 6 | 10 | 14 | |
| d | 2 | 5 | 9 | 13 |
| 1 | 4 | 8 | 12 |
In [7]:
Copied!
# 7. 열 이름 변경하기
df.rename(columns = {'c':'d'}) #c 열의 이름을 d로 변경합니다.
# 7. 열 이름 변경하기
df.rename(columns = {'c':'d'}) #c 열의 이름을 d로 변경합니다.
Out[7]:
| a | b | d | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 | |
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
In [8]:
Copied!
# 8. 인덱스 값 초기화하기
df.reset_index()
# 8. 인덱스 값 초기화하기
df.reset_index()
Out[8]:
| n | v | a | b | c | |
|---|---|---|---|---|---|
| 0 | d | 1 | 4 | 8 | 12 |
| 1 | d | 2 | 5 | 9 | 13 |
| 2 | e | 1 | 6 | 10 | 14 |
| 3 | e | 2 | 7 | 11 | 15 |
In [9]:
Copied!
# 9. 인덱스 순서대로 정렬하기
df.sort_index()
# 9. 인덱스 순서대로 정렬하기
df.sort_index()
Out[9]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 | |
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
In [10]:
Copied!
# 10. 특정 열 제거하기
df.drop(columns=['a', 'b'])
# 10. 특정 열 제거하기
df.drop(columns=['a', 'b'])
Out[10]:
| c | ||
|---|---|---|
| n | v | |
| d | 1 | 12 |
| 2 | 13 | |
| e | 1 | 14 |
| 2 | 15 |
C. 행 추출하기¶
In [11]:
Copied!
# 11. 맨 위의 행 출력하기
df.head(2) # 2행을 출력합니다.
# 11. 맨 위의 행 출력하기
df.head(2) # 2행을 출력합니다.
Out[11]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 |
In [12]:
Copied!
# 12. 맨 아래 행 출력하기
df.tail(2) # 2행을 출력합니다.
# 12. 맨 아래 행 출력하기
df.tail(2) # 2행을 출력합니다.
Out[12]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
In [13]:
Copied!
# 13. 특정 열의 값을 통해 추출하기
df[df["a"] > 4] # a열 중 4보다 큰 값이 있을 경우 해당 행을 추출합니다.
# 13. 특정 열의 값을 통해 추출하기
df[df["a"] > 4] # a열 중 4보다 큰 값이 있을 경우 해당 행을 추출합니다.
Out[13]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 2 | 5 | 9 | 13 |
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
In [14]:
Copied!
# 14. 특정 열에 특정 값이 있을 경우 추출하기
df[df["a"] == 6] # a열 중 6이 있을 경우 해당 행을 추출합니다.
# 14. 특정 열에 특정 값이 있을 경우 추출하기
df[df["a"] == 6] # a열 중 6이 있을 경우 해당 행을 추출합니다.
Out[14]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| e | 1 | 6 | 10 | 14 |
In [15]:
Copied!
# 15. 특정 열에 특정 값이 없을 경우 추출하기
df[df["a"] != 5] # a열 중 5가 없을 경우 해당 행을 추출합니다.
# 15. 특정 열에 특정 값이 없을 경우 추출하기
df[df["a"] != 5] # a열 중 5가 없을 경우 해당 행을 추출합니다.
Out[15]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
In [16]:
Copied!
# 16. 특정 열에 특정 숫자가 있는지 확인하기
df[df['a'].isin([4])] # 원하는 숫자를 리스트([int]) 형식으로 써줍니다.
# 16. 특정 열에 특정 숫자가 있는지 확인하기
df[df['a'].isin([4])] # 원하는 숫자를 리스트([int]) 형식으로 써줍니다.
Out[16]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
In [17]:
Copied!
# 17. 특정 비율로 데이터 샘플링하기
df.sample(frac=0.75) # 실행할 때마다 정해진 비율 만큼 랜덤하게 추출합니다.
# 17. 특정 비율로 데이터 샘플링하기
df.sample(frac=0.75) # 실행할 때마다 정해진 비율 만큼 랜덤하게 추출합니다.
Out[17]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| e | 1 | 6 | 10 | 14 |
| d | 1 | 4 | 8 | 12 |
| e | 2 | 7 | 11 | 15 |
In [18]:
Copied!
# 18. 특정 개수 만큼 데이터 샘플링하기
df.sample(n=3) # 실행할 때마다 n에서 정한 만큼 랜덤하게 추출합니다.
# 18. 특정 개수 만큼 데이터 샘플링하기
df.sample(n=3) # 실행할 때마다 n에서 정한 만큼 랜덤하게 추출합니다.
Out[18]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 2 | 5 | 9 | 13 |
| 1 | 4 | 8 | 12 | |
| e | 2 | 7 | 11 | 15 |
In [19]:
Copied!
# 19. 특정 열에서 큰 순서대로 불러오기
df.nlargest(3,'a') # a열에서 큰 순서대로 3개를 불러와 보겠습니다.
# 19. 특정 열에서 큰 순서대로 불러오기
df.nlargest(3,'a') # a열에서 큰 순서대로 3개를 불러와 보겠습니다.
Out[19]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| e | 2 | 7 | 11 | 15 |
| 1 | 6 | 10 | 14 | |
| d | 2 | 5 | 9 | 13 |
In [20]:
Copied!
# 20. 특정 열에서 작은 순서대로 불러오기
df.nsmallest(3,'a') # a열에서 작은 순서대로 3개를 불러와 보겠습니다.
# 20. 특정 열에서 작은 순서대로 불러오기
df.nsmallest(3,'a') # a열에서 작은 순서대로 3개를 불러와 보겠습니다.
Out[20]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 | |
| e | 1 | 6 | 10 | 14 |
D. 열 추출하기¶
In [21]:
Copied!
# 21.인덱스의 범위로 불러오기
# 0부터 세므로 첫 번째 줄은 인덱스 0, 4째 줄은 인덱스 3이 됩니다.
df.iloc[1:4] # [a:b]의 경우 a 인덱스부터 b-1인덱스까지 불러오라는 의미입니다.# a열에서 큰 순서대로 3개를 불러와 보겠습니다.
# 21.인덱스의 범위로 불러오기
# 0부터 세므로 첫 번째 줄은 인덱스 0, 4째 줄은 인덱스 3이 됩니다.
df.iloc[1:4] # [a:b]의 경우 a 인덱스부터 b-1인덱스까지 불러오라는 의미입니다.# a열에서 큰 순서대로 3개를 불러와 보겠습니다.
Out[21]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 2 | 5 | 9 | 13 |
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
In [22]:
Copied!
# 22.첫 인덱스를 지정해 불러오기
df.iloc[2:] # [a:]는 a인덱스부터 마지막 인덱스까지 불러오라는 의미입니다.
# 22.첫 인덱스를 지정해 불러오기
df.iloc[2:] # [a:]는 a인덱스부터 마지막 인덱스까지 불러오라는 의미입니다.
Out[22]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
In [23]:
Copied!
# 23.마지막 인덱스를 지정해 불러오기
df.iloc[:3] # [:b]는 처음부터 b-1 인덱스까지 불러오라는 의미입니다.
# 23.마지막 인덱스를 지정해 불러오기
df.iloc[:3] # [:b]는 처음부터 b-1 인덱스까지 불러오라는 의미입니다.
Out[23]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 | |
| e | 1 | 6 | 10 | 14 |
In [24]:
Copied!
# 24.모든 인덱스를 불러오기
df.iloc[:] # [:]는 모든 인덱스를 불러오라는 의미입니다.
# 24.모든 인덱스를 불러오기
df.iloc[:] # [:]는 모든 인덱스를 불러오라는 의미입니다.
Out[24]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 | |
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
In [25]:
Copied!
# 25.특정 열을 지정하여 가져오기
df[['a', 'b']] # a열과 b열을 가져오라는 의미입니다.
# 25.특정 열을 지정하여 가져오기
df[['a', 'b']] # a열과 b열을 가져오라는 의미입니다.
Out[25]:
| a | b | ||
|---|---|---|---|
| n | v | ||
| d | 1 | 4 | 8 |
| 2 | 5 | 9 | |
| e | 1 | 6 | 10 |
| 2 | 7 | 11 |
In [26]:
Copied!
# 26.조건을 만족하는 열 가져오기
df.filter(regex='c') # 열 이름에 c라는 문자가 포함되어 있으면 출력하라는 의미입니다.
# 26.조건을 만족하는 열 가져오기
df.filter(regex='c') # 열 이름에 c라는 문자가 포함되어 있으면 출력하라는 의미입니다.
Out[26]:
| c | ||
|---|---|---|
| n | v | |
| d | 1 | 12 |
| 2 | 13 | |
| e | 1 | 14 |
| 2 | 15 |
In [27]:
Copied!
# 27.특정 문자가 포함되지 않는 열 가져오기
df.filter(regex='^(?!c$).*') # 열 이름에 c라는 문자가 포함되어 있지 않으면 출력하라는 의미입니다.
# 27.특정 문자가 포함되지 않는 열 가져오기
df.filter(regex='^(?!c$).*') # 열 이름에 c라는 문자가 포함되어 있지 않으면 출력하라는 의미입니다.
Out[27]:
| a | b | ||
|---|---|---|---|
| n | v | ||
| d | 1 | 4 | 8 |
| 2 | 5 | 9 | |
| e | 1 | 6 | 10 |
| 2 | 7 | 11 |
E. 행과 열 추출하기¶
In [28]:
Copied!
# 28.특정한 행과 열을 지정해 가져오기
#df.loc[가져올 행,가져올 열]의 형태로 불러옵니다.
df.loc[:, 'a':'c'] # 모든 인덱스에서, a열부터 c열까지를 가져오라는 의미입니다.
# 28.특정한 행과 열을 지정해 가져오기
#df.loc[가져올 행,가져올 열]의 형태로 불러옵니다.
df.loc[:, 'a':'c'] # 모든 인덱스에서, a열부터 c열까지를 가져오라는 의미입니다.
Out[28]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 | |
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
In [29]:
Copied!
# 29. 인덱스로 특정 행과 열 가져오기
df.iloc[0:3, [0, 2]] # 0 인덱스부터 2인덱스까지, 0번째 열과 2번째 열을 가져오라는 의미입니다. (첫 열이 0번째입니다.)
# 29. 인덱스로 특정 행과 열 가져오기
df.iloc[0:3, [0, 2]] # 0 인덱스부터 2인덱스까지, 0번째 열과 2번째 열을 가져오라는 의미입니다. (첫 열이 0번째입니다.)
Out[29]:
| a | c | ||
|---|---|---|---|
| n | v | ||
| d | 1 | 4 | 12 |
| 2 | 5 | 13 | |
| e | 1 | 6 | 14 |
In [30]:
Copied!
# 30. 특정 열에서 조건을 만족하는 행과 열 가져오기
df.loc[df['a'] > 5, ['a', 'c']] # a열의 값이 5보다 큰 경우의 a열과 c열을 출력하라는 의미입니다.
# 30. 특정 열에서 조건을 만족하는 행과 열 가져오기
df.loc[df['a'] > 5, ['a', 'c']] # a열의 값이 5보다 큰 경우의 a열과 c열을 출력하라는 의미입니다.
Out[30]:
| a | c | ||
|---|---|---|---|
| n | v | ||
| e | 1 | 6 | 14 |
| 2 | 7 | 15 |
In [31]:
Copied!
# 31. 인덱스를 이용해 특정 조건을 만족하는 값 불러오기
df.iat[1, 2] # 1번째 인덱스에서 2번째 열 값을 가져옵니다.
# 31. 인덱스를 이용해 특정 조건을 만족하는 값 불러오기
df.iat[1, 2] # 1번째 인덱스에서 2번째 열 값을 가져옵니다.
Out[31]:
13
F. 중복 데이터 다루기¶
In [32]:
Copied!
# 실습을 위해 중복된 값이 포함된 데이터 프레임을 만들겠습니다.
df = pd.DataFrame(
{"a" : [4 ,5, 6, 7, 7],
"b" : [8, 9, 10, 11, 11],
"c" : [12, 13, 14, 15, 15]},
index = pd.MultiIndex.from_tuples(
[('d', 1), ('d', 2), ('e', 1), ('e', 2), ('e',3)],
names=['n', 'v']))
df
# 실습을 위해 중복된 값이 포함된 데이터 프레임을 만들겠습니다.
df = pd.DataFrame(
{"a" : [4 ,5, 6, 7, 7],
"b" : [8, 9, 10, 11, 11],
"c" : [12, 13, 14, 15, 15]},
index = pd.MultiIndex.from_tuples(
[('d', 1), ('d', 2), ('e', 1), ('e', 2), ('e',3)],
names=['n', 'v']))
df
Out[32]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 | |
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 | |
| 3 | 7 | 11 | 15 |
In [33]:
Copied!
# 32. 특정 열에 어떤 값이 몇 개 들어 있는지 알아보기
df['a'].value_counts()
# 32. 특정 열에 어떤 값이 몇 개 들어 있는지 알아보기
df['a'].value_counts()
Out[33]:
7 2 4 1 5 1 6 1 Name: a, dtype: int64
In [34]:
Copied!
# 33. 데이터 프레임의 행이 몇 개인지 세어보기
len(df)
# 33. 데이터 프레임의 행이 몇 개인지 세어보기
len(df)
Out[34]:
5
In [35]:
Copied!
# 34. 데이터 프레임의 행이 몇 개인지, 열이 몇 개인지 세어보기
df.shape
# 34. 데이터 프레임의 행이 몇 개인지, 열이 몇 개인지 세어보기
df.shape
Out[35]:
(5, 3)
In [36]:
Copied!
# 35. 특정 열에 유니크한 값이 몇 개인지 세어보기
df['a'].nunique()
# 35. 특정 열에 유니크한 값이 몇 개인지 세어보기
df['a'].nunique()
Out[36]:
4
In [37]:
Copied!
# 36. 데이터 프레임의 형태를 한눈에 보기
df.describe()
# 36. 데이터 프레임의 형태를 한눈에 보기
df.describe()
Out[37]:
| a | b | c | |
|---|---|---|---|
| count | 5.00000 | 5.00000 | 5.00000 |
| mean | 5.80000 | 9.80000 | 13.80000 |
| std | 1.30384 | 1.30384 | 1.30384 |
| min | 4.00000 | 8.00000 | 12.00000 |
| 25% | 5.00000 | 9.00000 | 13.00000 |
| 50% | 6.00000 | 10.00000 | 14.00000 |
| 75% | 7.00000 | 11.00000 | 15.00000 |
| max | 7.00000 | 11.00000 | 15.00000 |
In [38]:
Copied!
# 37. 중복된 값 제거하기
df = df.drop_duplicates()
df
# 37. 중복된 값 제거하기
df = df.drop_duplicates()
df
Out[38]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 | |
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
G. 데이터 파악하기¶
In [39]:
Copied!
# 38. 각 열의 합 보기
df.sum()
# 38. 각 열의 합 보기
df.sum()
Out[39]:
a 22 b 38 c 54 dtype: int64
In [40]:
Copied!
# 39. 각 열의 값이 모두 몇 개인지 보기
df.count()
# 39. 각 열의 값이 모두 몇 개인지 보기
df.count()
Out[40]:
a 4 b 4 c 4 dtype: int64
In [41]:
Copied!
# 40. 각 열의 중간 값 보기
df.median()
# 40. 각 열의 중간 값 보기
df.median()
Out[41]:
a 5.5 b 9.5 c 13.5 dtype: float64
In [42]:
Copied!
# 41. 특정 열의 평균 값 보기
df['b'].mean()
# 41. 특정 열의 평균 값 보기
df['b'].mean()
Out[42]:
9.5
In [43]:
Copied!
# 42. 각 열의 25%, 75%에 해당하는 수 보기
df.quantile([0.25,0.75])
# 42. 각 열의 25%, 75%에 해당하는 수 보기
df.quantile([0.25,0.75])
Out[43]:
| a | b | c | |
|---|---|---|---|
| 0.25 | 4.75 | 8.75 | 12.75 |
| 0.75 | 6.25 | 10.25 | 14.25 |
In [44]:
Copied!
# 43. 각 열의 최솟값 보기
df.min()
# 43. 각 열의 최솟값 보기
df.min()
Out[44]:
a 4 b 8 c 12 dtype: int64
In [45]:
Copied!
# 44. 각 열의 최댓값 보기
df.max()
# 44. 각 열의 최댓값 보기
df.max()
Out[45]:
a 7 b 11 c 15 dtype: int64
In [46]:
Copied!
# 45. 각 열의 표준편차 보기
df.std()
# 45. 각 열의 표준편차 보기
df.std()
Out[46]:
a 1.290994 b 1.290994 c 1.290994 dtype: float64
In [47]:
Copied!
# 46. 데이터 프레임 각 값에 일괄 함수 적용하기
import numpy as np
df.apply(np.sqrt) # 제곱근 구하기
# 46. 데이터 프레임 각 값에 일괄 함수 적용하기
import numpy as np
df.apply(np.sqrt) # 제곱근 구하기
Out[47]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 2.000000 | 2.828427 | 3.464102 |
| 2 | 2.236068 | 3.000000 | 3.605551 | |
| e | 1 | 2.449490 | 3.162278 | 3.741657 |
| 2 | 2.645751 | 3.316625 | 3.872983 |
H. 결측치 다루기¶
In [48]:
Copied!
# 넘파이 라이브러리를 이용해 null 값이 들어 있는 데이터 프레임 만들기
df = pd.DataFrame(
{"a" : [4 ,5, 6, np.nan],
"b" : [7, 8, np.nan, 9],
"c" : [10, np.nan, 11, 12]},
index = pd.MultiIndex.from_tuples(
[('d', 1), ('d', 2), ('e', 1), ('e', 2)],
names=['n', 'v']))
df
# 넘파이 라이브러리를 이용해 null 값이 들어 있는 데이터 프레임 만들기
df = pd.DataFrame(
{"a" : [4 ,5, 6, np.nan],
"b" : [7, 8, np.nan, 9],
"c" : [10, np.nan, 11, 12]},
index = pd.MultiIndex.from_tuples(
[('d', 1), ('d', 2), ('e', 1), ('e', 2)],
names=['n', 'v']))
df
Out[48]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4.0 | 7.0 | 10.0 |
| 2 | 5.0 | 8.0 | NaN | |
| e | 1 | 6.0 | NaN | 11.0 |
| 2 | NaN | 9.0 | 12.0 |
In [49]:
Copied!
# 47. null 값인지 확인하기
pd.isnull(df)
# 47. null 값인지 확인하기
pd.isnull(df)
Out[49]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | False | False | False |
| 2 | False | False | True | |
| e | 1 | False | True | False |
| 2 | True | False | False |
In [50]:
Copied!
# 48. null 값이 아닌지를 확인하기
pd.notnull(df)
# 48. null 값이 아닌지를 확인하기
pd.notnull(df)
Out[50]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | True | True | True |
| 2 | True | True | False | |
| e | 1 | True | False | True |
| 2 | False | True | True |
In [51]:
Copied!
# 49. null 값이 있는 행 삭제하기
df_notnull = df.dropna()
df_notnull
# 49. null 값이 있는 행 삭제하기
df_notnull = df.dropna()
df_notnull
Out[51]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4.0 | 7.0 | 10.0 |
In [52]:
Copied!
# 50. null 값을 특정한 값으로 대체하기
df_fillna = df.fillna(13)
df_fillna
# 50. null 값을 특정한 값으로 대체하기
df_fillna = df.fillna(13)
df_fillna
Out[52]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4.0 | 7.0 | 10.0 |
| 2 | 5.0 | 8.0 | 13.0 | |
| e | 1 | 6.0 | 13.0 | 11.0 |
| 2 | 13.0 | 9.0 | 12.0 |
In [53]:
Copied!
# 51. null 값을 특정한 계산 결과으로 대체하기
df_fillna_mean = df.fillna(df['a'].mean()) # a열의 평균 값으로 대체
df_fillna_mean
# 51. null 값을 특정한 계산 결과으로 대체하기
df_fillna_mean = df.fillna(df['a'].mean()) # a열의 평균 값으로 대체
df_fillna_mean
Out[53]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4.0 | 7.0 | 10.0 |
| 2 | 5.0 | 8.0 | 5.0 | |
| e | 1 | 6.0 | 5.0 | 11.0 |
| 2 | 5.0 | 9.0 | 12.0 |
I. 새로운 열 만들기¶
In [54]:
Copied!
# 새로운 열 만들기 실습을 위한 데이터 프레임 만들기
df = pd.DataFrame(
{"a" : [4 ,5, 6, 7],
"b" : [8, 9, 10, 11],
"c" : [12, 13, 14, 15]},
index = pd.MultiIndex.from_tuples( # 인덱스를 튜플로 지정합니다.
[('d', 1), ('d', 2), ('e', 1), ('e', 2)],
names=['n', 'v'])) # 인덱스 이름을 지정합니다.
df
# 새로운 열 만들기 실습을 위한 데이터 프레임 만들기
df = pd.DataFrame(
{"a" : [4 ,5, 6, 7],
"b" : [8, 9, 10, 11],
"c" : [12, 13, 14, 15]},
index = pd.MultiIndex.from_tuples( # 인덱스를 튜플로 지정합니다.
[('d', 1), ('d', 2), ('e', 1), ('e', 2)],
names=['n', 'v'])) # 인덱스 이름을 지정합니다.
df
Out[54]:
| a | b | c | ||
|---|---|---|---|---|
| n | v | |||
| d | 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 | |
| e | 1 | 6 | 10 | 14 |
| 2 | 7 | 11 | 15 |
In [55]:
Copied!
# 52. 조건에 맞는 새 열 만들기
df['sum'] = df['a']+df['b']+df['c']
df
# 52. 조건에 맞는 새 열 만들기
df['sum'] = df['a']+df['b']+df['c']
df
Out[55]:
| a | b | c | sum | ||
|---|---|---|---|---|---|
| n | v | ||||
| d | 1 | 4 | 8 | 12 | 24 |
| 2 | 5 | 9 | 13 | 27 | |
| e | 1 | 6 | 10 | 14 | 30 |
| 2 | 7 | 11 | 15 | 33 |
In [56]:
Copied!
# 53. assign()을 이용해 조건에 맞는 새 열 만들기
df = df.assign(multiply=lambda df: df['a']*df['b']*df['c']) # a,b,c열의 값을 모두 더해 d열을 만들어 줍니다.
df
# 53. assign()을 이용해 조건에 맞는 새 열 만들기
df = df.assign(multiply=lambda df: df['a']*df['b']*df['c']) # a,b,c열의 값을 모두 더해 d열을 만들어 줍니다.
df
Out[56]:
| a | b | c | sum | multiply | ||
|---|---|---|---|---|---|---|
| n | v | |||||
| d | 1 | 4 | 8 | 12 | 24 | 384 |
| 2 | 5 | 9 | 13 | 27 | 585 | |
| e | 1 | 6 | 10 | 14 | 30 | 840 |
| 2 | 7 | 11 | 15 | 33 | 1155 |
In [57]:
Copied!
# 54. 숫자형 데이터를 구간으로 나누기
df['qcut'] = pd.qcut(df['a'], 2, labels=["600이하","600이상"]) # a열을 2개로 나누어 각각 새롭게 레이블을 만들라는 의미
df
# 54. 숫자형 데이터를 구간으로 나누기
df['qcut'] = pd.qcut(df['a'], 2, labels=["600이하","600이상"]) # a열을 2개로 나누어 각각 새롭게 레이블을 만들라는 의미
df
Out[57]:
| a | b | c | sum | multiply | qcut | ||
|---|---|---|---|---|---|---|---|
| n | v | ||||||
| d | 1 | 4 | 8 | 12 | 24 | 384 | 600이하 |
| 2 | 5 | 9 | 13 | 27 | 585 | 600이하 | |
| e | 1 | 6 | 10 | 14 | 30 | 840 | 600이상 |
| 2 | 7 | 11 | 15 | 33 | 1155 | 600이상 |
In [58]:
Copied!
# 55. 기준 값 이하와 이상을 모두 통일시키기
df['clip'] = df['a'].clip(lower=5,upper=6) # a열에서 5이하는 모두 5로, 6 이상은 모두 6으로 변환
df
# 55. 기준 값 이하와 이상을 모두 통일시키기
df['clip'] = df['a'].clip(lower=5,upper=6) # a열에서 5이하는 모두 5로, 6 이상은 모두 6으로 변환
df
Out[58]:
| a | b | c | sum | multiply | qcut | clip | ||
|---|---|---|---|---|---|---|---|---|
| n | v | |||||||
| d | 1 | 4 | 8 | 12 | 24 | 384 | 600이하 | 5 |
| 2 | 5 | 9 | 13 | 27 | 585 | 600이하 | 5 | |
| e | 1 | 6 | 10 | 14 | 30 | 840 | 600이상 | 6 |
| 2 | 7 | 11 | 15 | 33 | 1155 | 600이상 | 6 |
In [59]:
Copied!
# 56. 최댓값 불러오기
df.max(axis=0) #axis=0은 행과 행 비교, axis=1은 열과 열 비교
# 56. 최댓값 불러오기
df.max(axis=0) #axis=0은 행과 행 비교, axis=1은 열과 열 비교
Out[59]:
a 7 b 11 c 15 sum 33 multiply 1155 qcut 600이상 clip 6 dtype: object
In [60]:
Copied!
# 57. 최솟값 불러오기
df.min(axis=0)
# 57. 최솟값 불러오기
df.min(axis=0)
Out[60]:
a 4 b 8 c 12 sum 24 multiply 384 qcut 600이하 clip 5 dtype: object
J. 행과 열 변환하기¶
In [61]:
Copied!
# 열을 행으로, 행을 열로 변형하기
# 실습을 위해 새로운 데이터 만들기
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},
'B': {0: 1, 1: 3, 2: 5},
'C': {0: 2, 1: 4, 2: 6}})
df
# 열을 행으로, 행을 열로 변형하기
# 실습을 위해 새로운 데이터 만들기
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},
'B': {0: 1, 1: 3, 2: 5},
'C': {0: 2, 1: 4, 2: 6}})
df
Out[61]:
| A | B | C | |
|---|---|---|---|
| 0 | a | 1 | 2 |
| 1 | b | 3 | 4 |
| 2 | c | 5 | 6 |
In [62]:
Copied!
# 58. 모든 열을 행으로 변환하기
pd.melt(df)
# 58. 모든 열을 행으로 변환하기
pd.melt(df)
Out[62]:
| variable | value | |
|---|---|---|
| 0 | A | a |
| 1 | A | b |
| 2 | A | c |
| 3 | B | 1 |
| 4 | B | 3 |
| 5 | B | 5 |
| 6 | C | 2 |
| 7 | C | 4 |
| 8 | C | 6 |
In [63]:
Copied!
# 59. 하나의 열만 행으로 이동시키기
pd.melt(df, id_vars=['A'], value_vars=['B']) # A열만 그대로, B열은 행으로 이동시키기
# 59. 하나의 열만 행으로 이동시키기
pd.melt(df, id_vars=['A'], value_vars=['B']) # A열만 그대로, B열은 행으로 이동시키기
Out[63]:
| A | variable | value | |
|---|---|---|---|
| 0 | a | B | 1 |
| 1 | b | B | 3 |
| 2 | c | B | 5 |
In [64]:
Copied!
# 60. 여러 개의 열을 행으로 이동시키기
df_melt = pd.melt(df, id_vars=['A'], value_vars=['B','C']) # A열만 그대로, B열과 C열은 행으로 이동시키기
df_melt
# 60. 여러 개의 열을 행으로 이동시키기
df_melt = pd.melt(df, id_vars=['A'], value_vars=['B','C']) # A열만 그대로, B열과 C열은 행으로 이동시키기
df_melt
Out[64]:
| A | variable | value | |
|---|---|---|---|
| 0 | a | B | 1 |
| 1 | b | B | 3 |
| 2 | c | B | 5 |
| 3 | a | C | 2 |
| 4 | b | C | 4 |
| 5 | c | C | 6 |
In [65]:
Copied!
#61. 특정 열의 값을 기준으로 새로운 열 만들기
df_pivot = df_melt.pivot(index='A', columns='variable', values='value') # A열을 새로운 인덱스로 만들고, B열과 C열을 이에 따라 정리
df_pivot
#61. 특정 열의 값을 기준으로 새로운 열 만들기
df_pivot = df_melt.pivot(index='A', columns='variable', values='value') # A열을 새로운 인덱스로 만들고, B열과 C열을 이에 따라 정리
df_pivot
Out[65]:
| variable | B | C |
|---|---|---|
| A | ||
| a | 1 | 2 |
| b | 3 | 4 |
| c | 5 | 6 |
In [66]:
Copied!
#62. 원래 데이터 형태로 되돌리기
df_origin = df_pivot.reset_index() # 인덱스를 리셋
df_origin.columns.name = None # 인덱스 열의 이름을 초기화
df_origin
#62. 원래 데이터 형태로 되돌리기
df_origin = df_pivot.reset_index() # 인덱스를 리셋
df_origin.columns.name = None # 인덱스 열의 이름을 초기화
df_origin
Out[66]:
| A | B | C | |
|---|---|---|---|
| 0 | a | 1 | 2 |
| 1 | b | 3 | 4 |
| 2 | c | 5 | 6 |
K. 시리즈 데이터 연결하기¶
In [67]:
Copied!
# 시리즈 데이터 만들기
s1 = pd.Series(['a', 'b'])
s1
# 시리즈 데이터 만들기
s1 = pd.Series(['a', 'b'])
s1
Out[67]:
0 a 1 b dtype: object
In [68]:
Copied!
# 시리즈 데이터 2
s2 = pd.Series(['c', 'd'])
s2
# 시리즈 데이터 2
s2 = pd.Series(['c', 'd'])
s2
Out[68]:
0 c 1 d dtype: object
In [69]:
Copied!
# 63. 시리즈 데이터 합치기
pd.concat([s1, s2])
# 63. 시리즈 데이터 합치기
pd.concat([s1, s2])
Out[69]:
0 a 1 b 0 c 1 d dtype: object
In [70]:
Copied!
# 64. 데이터 병합 시 새로운 인덱스 만들기
pd.concat([s1, s2], ignore_index=True)
# 64. 데이터 병합 시 새로운 인덱스 만들기
pd.concat([s1, s2], ignore_index=True)
Out[70]:
0 a 1 b 2 c 3 d dtype: object
In [71]:
Copied!
# 65. 계층적 인덱스 추가하고 열 이름 지정하기
pd.concat([s1, s2],
keys=['s1', 's2'],
names=['Series name', 'Row ID'])
# 65. 계층적 인덱스 추가하고 열 이름 지정하기
pd.concat([s1, s2],
keys=['s1', 's2'],
names=['Series name', 'Row ID'])
Out[71]:
Series name Row ID
s1 0 a
1 b
s2 0 c
1 d
dtype: object
L. 데이터 프레임 연결하기¶
In [72]:
Copied!
# 데이터 프레임 합치기
# 데이터 프레임 1
df1 = pd.DataFrame([['a', 1],
['b', 2]],
columns=['letter', 'number'])
df1
# 데이터 프레임 합치기
# 데이터 프레임 1
df1 = pd.DataFrame([['a', 1],
['b', 2]],
columns=['letter', 'number'])
df1
Out[72]:
| letter | number | |
|---|---|---|
| 0 | a | 1 |
| 1 | b | 2 |
In [73]:
Copied!
# 데이터 프레임 2
df2 = pd.DataFrame([['c', 3],
['d', 4]],
columns=['letter', 'number'])
df2
# 데이터 프레임 2
df2 = pd.DataFrame([['c', 3],
['d', 4]],
columns=['letter', 'number'])
df2
Out[73]:
| letter | number | |
|---|---|---|
| 0 | c | 3 |
| 1 | d | 4 |
In [74]:
Copied!
# 데이터 프레임 3
df3 = pd.DataFrame([['c', 3, 'cat'],
['d', 4, 'dog']],
columns=['letter', 'number', 'animal'])
df3
# 데이터 프레임 3
df3 = pd.DataFrame([['c', 3, 'cat'],
['d', 4, 'dog']],
columns=['letter', 'number', 'animal'])
df3
Out[74]:
| letter | number | animal | |
|---|---|---|---|
| 0 | c | 3 | cat |
| 1 | d | 4 | dog |
In [75]:
Copied!
#데이터 프레임 4
df4 = pd.DataFrame([['bird', 'polly'],
['monkey', 'george']],
columns=['animal', 'name'])
df4
#데이터 프레임 4
df4 = pd.DataFrame([['bird', 'polly'],
['monkey', 'george']],
columns=['animal', 'name'])
df4
Out[75]:
| animal | name | |
|---|---|---|
| 0 | bird | polly |
| 1 | monkey | george |
In [76]:
Copied!
# 66. 데이터 프레임 합치기
pd.concat([df1, df2])
# 66. 데이터 프레임 합치기
pd.concat([df1, df2])
Out[76]:
| letter | number | |
|---|---|---|
| 0 | a | 1 |
| 1 | b | 2 |
| 0 | c | 3 |
| 1 | d | 4 |
In [77]:
Copied!
# 67. 열의 수가 다른 두 데이터 프레임 합치기
pd.concat([df1, df3])
# 67. 열의 수가 다른 두 데이터 프레임 합치기
pd.concat([df1, df3])
Out[77]:
| letter | number | animal | |
|---|---|---|---|
| 0 | a | 1 | NaN |
| 1 | b | 2 | NaN |
| 0 | c | 3 | cat |
| 1 | d | 4 | dog |
In [78]:
Copied!
# 68. 함께 공유하는 열만 합치기
pd.concat([df1, df3], join="inner")
# 68. 함께 공유하는 열만 합치기
pd.concat([df1, df3], join="inner")
Out[78]:
| letter | number | |
|---|---|---|
| 0 | a | 1 |
| 1 | b | 2 |
| 0 | c | 3 |
| 1 | d | 4 |
In [79]:
Copied!
# 69. 열 이름이 서로 다른 데이터 합치기
pd.concat([df1, df4], axis=1)
# 69. 열 이름이 서로 다른 데이터 합치기
pd.concat([df1, df4], axis=1)
Out[79]:
| letter | number | animal | name | |
|---|---|---|---|---|
| 0 | a | 1 | bird | polly |
| 1 | b | 2 | monkey | george |
M. 데이터 병합하기¶
In [80]:
Copied!
# 실습을 위한 데이터 프레임 만들기 1
adf = pd.DataFrame({"x1" : ["A","B","C"],
"x2": [1,2,3]})
adf
# 실습을 위한 데이터 프레임 만들기 1
adf = pd.DataFrame({"x1" : ["A","B","C"],
"x2": [1,2,3]})
adf
Out[80]:
| x1 | x2 | |
|---|---|---|
| 0 | A | 1 |
| 1 | B | 2 |
| 2 | C | 3 |
In [81]:
Copied!
# 데이터 프레임 만들기 2
bdf = pd.DataFrame({"x1" : ["A","B","D"],
"x3": ["T","F","T"]})
bdf
# 데이터 프레임 만들기 2
bdf = pd.DataFrame({"x1" : ["A","B","D"],
"x3": ["T","F","T"]})
bdf
Out[81]:
| x1 | x3 | |
|---|---|---|
| 0 | A | T |
| 1 | B | F |
| 2 | D | T |
In [82]:
Copied!
# 데이터 프레임 만들기 3
cdf = pd.DataFrame({"x1" : ["B","C","D"],
"x2": [2,3,4]})
cdf
# 데이터 프레임 만들기 3
cdf = pd.DataFrame({"x1" : ["B","C","D"],
"x2": [2,3,4]})
cdf
Out[82]:
| x1 | x2 | |
|---|---|---|
| 0 | B | 2 |
| 1 | C | 3 |
| 2 | D | 4 |
In [83]:
Copied!
# 70. 왼쪽 열을 축으로 병합하기
pd.merge(adf, bdf, how='left', on='x1')
# x1을 키로 해서 병합, 왼쪽(adf)를 기준으로
# 왼쪽의 adf에는 D가 없으므로 해당 값은 NaN으로 변환
# 70. 왼쪽 열을 축으로 병합하기
pd.merge(adf, bdf, how='left', on='x1')
# x1을 키로 해서 병합, 왼쪽(adf)를 기준으로
# 왼쪽의 adf에는 D가 없으므로 해당 값은 NaN으로 변환
Out[83]:
| x1 | x2 | x3 | |
|---|---|---|---|
| 0 | A | 1 | T |
| 1 | B | 2 | F |
| 2 | C | 3 | NaN |
In [84]:
Copied!
# 71. 오른쪽 열을 축으로 병합하기
pd.merge(adf, bdf, how='right', on='x1')
# x1을 키로 해서 병합, 오른쪽(bdf)을 기준으로
# 오른쪽의 bdf에는 C가 없으므로 해당 값은 NaN으로 변환
# 71. 오른쪽 열을 축으로 병합하기
pd.merge(adf, bdf, how='right', on='x1')
# x1을 키로 해서 병합, 오른쪽(bdf)을 기준으로
# 오른쪽의 bdf에는 C가 없으므로 해당 값은 NaN으로 변환
Out[84]:
| x1 | x2 | x3 | |
|---|---|---|---|
| 0 | A | 1.0 | T |
| 1 | B | 2.0 | F |
| 2 | D | NaN | T |
In [85]:
Copied!
# 72. 공통의 값만 병합
pd.merge(adf, bdf, how='inner', on='x1')
# 72. 공통의 값만 병합
pd.merge(adf, bdf, how='inner', on='x1')
Out[85]:
| x1 | x2 | x3 | |
|---|---|---|---|
| 0 | A | 1 | T |
| 1 | B | 2 | F |
In [86]:
Copied!
# 73. 모든 값을 병합
pd.merge(adf, bdf, how='outer', on='x1')
# 73. 모든 값을 병합
pd.merge(adf, bdf, how='outer', on='x1')
Out[86]:
| x1 | x2 | x3 | |
|---|---|---|---|
| 0 | A | 1.0 | T |
| 1 | B | 2.0 | F |
| 2 | C | 3.0 | NaN |
| 3 | D | NaN | T |
In [87]:
Copied!
# 74. 특정한 열을 비교하여 공통 값이 존재하는 경우만 가져오기
adf[adf.x1.isin(bdf.x1)]
# adf와 bdf의 특정한 열을 비교하여 공통 값이 존재하는 경우만 가져오기
# adf.x1열과 bdf.x1열은 A,B가 같다. 따라서 adf의 해당 값만 출력
# 74. 특정한 열을 비교하여 공통 값이 존재하는 경우만 가져오기
adf[adf.x1.isin(bdf.x1)]
# adf와 bdf의 특정한 열을 비교하여 공통 값이 존재하는 경우만 가져오기
# adf.x1열과 bdf.x1열은 A,B가 같다. 따라서 adf의 해당 값만 출력
Out[87]:
| x1 | x2 | |
|---|---|---|
| 0 | A | 1 |
| 1 | B | 2 |
In [88]:
Copied!
# 75. 공통 값이 존재하는 경우 해당 값을 제외하고 병합하기
adf[~adf.x1.isin(bdf.x1)] # 해당 값만 빼고 출력
# 75. 공통 값이 존재하는 경우 해당 값을 제외하고 병합하기
adf[~adf.x1.isin(bdf.x1)] # 해당 값만 빼고 출력
Out[88]:
| x1 | x2 | |
|---|---|---|
| 2 | C | 3 |
In [89]:
Copied!
# 76. 공통의 값이 있는 것만 병합
pd.merge(adf, cdf)
# 76. 공통의 값이 있는 것만 병합
pd.merge(adf, cdf)
Out[89]:
| x1 | x2 | |
|---|---|---|
| 0 | B | 2 |
| 1 | C | 3 |
In [90]:
Copied!
# 77. 모두 병합
pd.merge(adf, cdf, how='outer')
# 77. 모두 병합
pd.merge(adf, cdf, how='outer')
Out[90]:
| x1 | x2 | |
|---|---|---|
| 0 | A | 1 |
| 1 | B | 2 |
| 2 | C | 3 |
| 3 | D | 4 |
In [91]:
Copied!
# 78. 어디서 병합되었는지 표시하기
pd.merge(adf, cdf, how='outer', indicator=True)
# 78. 어디서 병합되었는지 표시하기
pd.merge(adf, cdf, how='outer', indicator=True)
Out[91]:
| x1 | x2 | _merge | |
|---|---|---|---|
| 0 | A | 1 | left_only |
| 1 | B | 2 | both |
| 2 | C | 3 | both |
| 3 | D | 4 | right_only |
In [92]:
Copied!
# 79. 원하는 병합 만 남기기
pd.merge(adf, cdf, how='outer', indicator=True).query('_merge == "left_only"')
# 79. 원하는 병합 만 남기기
pd.merge(adf, cdf, how='outer', indicator=True).query('_merge == "left_only"')
Out[92]:
| x1 | x2 | _merge | |
|---|---|---|---|
| 0 | A | 1 | left_only |
In [93]:
Copied!
# 80. merge 컬럼 없애기
pd.merge(adf, cdf, how='outer', indicator=True).query('_merge == "left_only"').drop(columns=['_merge'])
# 80. merge 컬럼 없애기
pd.merge(adf, cdf, how='outer', indicator=True).query('_merge == "left_only"').drop(columns=['_merge'])
Out[93]:
| x1 | x2 | |
|---|---|---|
| 0 | A | 1 |
N. 데이터 가공하기¶
In [94]:
Copied!
# 실습을 위해 데이터 프레임을 만들어 줍니다.
df = pd.DataFrame(
{"a" : [4 ,5, 6, 7], # 열 이름을 지정해 주고 시리즈 형태로 데이터를 저장합니다.
"b" : [8, 9, 10, 11],
"c" : [12, 13, 14, 15]},
index = [1, 2, 3, 4]) # 인덱스는 1,2,3으로 정해 줍니다.
df
# 실습을 위해 데이터 프레임을 만들어 줍니다.
df = pd.DataFrame(
{"a" : [4 ,5, 6, 7], # 열 이름을 지정해 주고 시리즈 형태로 데이터를 저장합니다.
"b" : [8, 9, 10, 11],
"c" : [12, 13, 14, 15]},
index = [1, 2, 3, 4]) # 인덱스는 1,2,3으로 정해 줍니다.
df
Out[94]:
| a | b | c | |
|---|---|---|---|
| 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 |
| 3 | 6 | 10 | 14 |
| 4 | 7 | 11 | 15 |
In [95]:
Copied!
# 81. 행 전체를 한 칸 아래로 이동하기
df.shift(1)
# 81. 행 전체를 한 칸 아래로 이동하기
df.shift(1)
Out[95]:
| a | b | c | |
|---|---|---|---|
| 1 | NaN | NaN | NaN |
| 2 | 4.0 | 8.0 | 12.0 |
| 3 | 5.0 | 9.0 | 13.0 |
| 4 | 6.0 | 10.0 | 14.0 |
In [96]:
Copied!
# 82. 행 전체를 한 칸 위로 이동하기
df.shift(-1)
# 82. 행 전체를 한 칸 위로 이동하기
df.shift(-1)
Out[96]:
| a | b | c | |
|---|---|---|---|
| 1 | 5.0 | 9.0 | 13.0 |
| 2 | 6.0 | 10.0 | 14.0 |
| 3 | 7.0 | 11.0 | 15.0 |
| 4 | NaN | NaN | NaN |
In [97]:
Copied!
# 83. 윗 행부터 누적해서 더하기
df.cumsum()
# 83. 윗 행부터 누적해서 더하기
df.cumsum()
Out[97]:
| a | b | c | |
|---|---|---|---|
| 1 | 4 | 8 | 12 |
| 2 | 9 | 17 | 25 |
| 3 | 15 | 27 | 39 |
| 4 | 22 | 38 | 54 |
In [98]:
Copied!
# 84. 새 행과 이전 행을 비교하면서 최댓값을 출력
df.cummax()
# 84. 새 행과 이전 행을 비교하면서 최댓값을 출력
df.cummax()
Out[98]:
| a | b | c | |
|---|---|---|---|
| 1 | 4 | 8 | 12 |
| 2 | 5 | 9 | 13 |
| 3 | 6 | 10 | 14 |
| 4 | 7 | 11 | 15 |
In [99]:
Copied!
# 85. 새 행과 이전 행을 비교하면서 최솟값을 출력
df.cummin()
# 85. 새 행과 이전 행을 비교하면서 최솟값을 출력
df.cummin()
Out[99]:
| a | b | c | |
|---|---|---|---|
| 1 | 4 | 8 | 12 |
| 2 | 4 | 8 | 12 |
| 3 | 4 | 8 | 12 |
| 4 | 4 | 8 | 12 |
In [100]:
Copied!
# 85. 윗 행부터 누적해서 곱하기
df.cumprod()
# 85. 윗 행부터 누적해서 곱하기
df.cumprod()
Out[100]:
| a | b | c | |
|---|---|---|---|
| 1 | 4 | 8 | 12 |
| 2 | 20 | 72 | 156 |
| 3 | 120 | 720 | 2184 |
| 4 | 840 | 7920 | 32760 |
O. 그룹별로 집계하기¶
In [101]:
Copied!
# 실습을 위해 데이터 불러오기
# 모두의 딥러닝 15장, 주택 가격 예측 데이터를 불러 옵니다.
df = pd.read_csv("../data/house_train.csv")
df
# 실습을 위해 데이터 불러오기
# 모두의 딥러닝 15장, 주택 가격 예측 데이터를 불러 옵니다.
df = pd.read_csv("../data/house_train.csv")
df
Out[101]:
| Id | MSSubClass | MSZoning | LotFrontage | LotArea | Street | Alley | LotShape | LandContour | Utilities | ... | PoolArea | PoolQC | Fence | MiscFeature | MiscVal | MoSold | YrSold | SaleType | SaleCondition | SalePrice | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 60 | RL | 65.0 | 8450 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 2 | 2008 | WD | Normal | 208500 |
| 1 | 2 | 20 | RL | 80.0 | 9600 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 5 | 2007 | WD | Normal | 181500 |
| 2 | 3 | 60 | RL | 68.0 | 11250 | Pave | NaN | IR1 | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 9 | 2008 | WD | Normal | 223500 |
| 3 | 4 | 70 | RL | 60.0 | 9550 | Pave | NaN | IR1 | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 2 | 2006 | WD | Abnorml | 140000 |
| 4 | 5 | 60 | RL | 84.0 | 14260 | Pave | NaN | IR1 | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 12 | 2008 | WD | Normal | 250000 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1455 | 1456 | 60 | RL | 62.0 | 7917 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 8 | 2007 | WD | Normal | 175000 |
| 1456 | 1457 | 20 | RL | 85.0 | 13175 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | MnPrv | NaN | 0 | 2 | 2010 | WD | Normal | 210000 |
| 1457 | 1458 | 70 | RL | 66.0 | 9042 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | GdPrv | Shed | 2500 | 5 | 2010 | WD | Normal | 266500 |
| 1458 | 1459 | 20 | RL | 68.0 | 9717 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 4 | 2010 | WD | Normal | 142125 |
| 1459 | 1460 | 20 | RL | 75.0 | 9937 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 6 | 2008 | WD | Normal | 147500 |
1460 rows × 81 columns
In [102]:
Copied!
# 87. 그룹 지정 및 그룹별 데이터 수 표시
df.groupby(by="YrSold").size() # 팔린 연도를 중심으로 그룹을 만든 후, 각 그룹별 수를 표시
# 87. 그룹 지정 및 그룹별 데이터 수 표시
df.groupby(by="YrSold").size() # 팔린 연도를 중심으로 그룹을 만든 후, 각 그룹별 수를 표시
Out[102]:
YrSold 2006 314 2007 329 2008 304 2009 338 2010 175 dtype: int64
In [103]:
Copied!
#88. 그룹 지정 후 원하는 컬럼 표시하기
df.groupby(by="YrSold")['LotArea'].mean() # 팔린 연도를 중심으로 그룹을 만들 후, 각 그룹별 주차장의 넓이를 표시.
#88. 그룹 지정 후 원하는 컬럼 표시하기
df.groupby(by="YrSold")['LotArea'].mean() # 팔린 연도를 중심으로 그룹을 만들 후, 각 그룹별 주차장의 넓이를 표시.
Out[103]:
YrSold 2006 10489.458599 2007 10863.686930 2008 10587.687500 2009 10294.248521 2010 10220.645714 Name: LotArea, dtype: float64
In [104]:
Copied!
# 89. 밀집도 기준으로 순위 부여하기
df['SalePrice'].rank(method='dense') # 각 집 값은 밀집도를 기준으로 몇 번째인가
# 89. 밀집도 기준으로 순위 부여하기
df['SalePrice'].rank(method='dense') # 각 집 값은 밀집도를 기준으로 몇 번째인가
Out[104]:
0 413.0
1 340.0
2 443.0
3 195.0
4 495.0
...
1455 315.0
1456 416.0
1457 528.0
1458 200.0
1459 222.0
Name: SalePrice, Length: 1460, dtype: float64
In [105]:
Copied!
# 90. 최저 값을 기준으로 순위 부여하기
df['SalePrice'].rank(method='min') # 각 집 값이 최저 값을 기준으로 몇 번째인가
# 90. 최저 값을 기준으로 순위 부여하기
df['SalePrice'].rank(method='min') # 각 집 값이 최저 값을 기준으로 몇 번째인가
Out[105]:
0 1072.0
1 909.0
2 1135.0
3 490.0
4 1236.0
...
1455 828.0
1456 1076.0
1457 1285.0
1458 524.0
1459 591.0
Name: SalePrice, Length: 1460, dtype: float64
In [106]:
Copied!
# 91. 순위를 비율로 표시하기
df['SalePrice'].rank(pct=True) # 집 값의 순위를 비율로 표시 (0=가장 싼 집, 1=가장 비싼 집)
# 91. 순위를 비율로 표시하기
df['SalePrice'].rank(pct=True) # 집 값의 순위를 비율로 표시 (0=가장 싼 집, 1=가장 비싼 집)
Out[106]:
0 0.734247
1 0.622603
2 0.777740
3 0.342123
4 0.848973
...
1455 0.569863
1456 0.738356
1457 0.880137
1458 0.358904
1459 0.404795
Name: SalePrice, Length: 1460, dtype: float64
In [107]:
Copied!
# 92. 동일 순위에 대한 처리 방법 정하기
df['SalePrice'].rank(method='first') # 순위가 같을 때 순서가 빠른 사람을 상위로 처리하기
# 92. 동일 순위에 대한 처리 방법 정하기
df['SalePrice'].rank(method='first') # 순위가 같을 때 순서가 빠른 사람을 상위로 처리하기
Out[107]:
0 1072.0
1 909.0
2 1135.0
3 490.0
4 1236.0
...
1455 836.0
1456 1080.0
1457 1285.0
1458 524.0
1459 591.0
Name: SalePrice, Length: 1460, dtype: float64