2020/09/18 - [Python/Pandas Tutorial] - [Python] Pandas Tutorial :: pandas란? 데이터프레임이란? 시리즈란?
2020/09/19 - [Python/Pandas Tutorial] - [Python] Pandas Tutorial :: read csv, txt file with pandas
판다스 데이터프레임에 행, 열 추가, 변경하기
먼저 판다스 라이브러리를 import 하고, 실습을 위한 데이터를 만든다.
import pandas as pd
# 1. Create DataFrame
friend_dict = [
{'name':'John', 'age':15, 'job':'student'},
{'name':'Jenny', 'age':30, 'job':'developer'},
{'name':'Nate', 'age':30, 'job':'teacher'}
]
df = pd.DataFrame(friend_dict,
columns=['name','age','job'])
> df
name age job
0 John 15 student
1 Jenny 30 developer
2 Nate 30 teacher
미리 만들어 놓은 데이터프레임에 "salary(연봉)" 컬럼을 추가한다. 직업이 학생이면 "no", 학생이 아니면 "yes"라 하겠다.
import numpy as np ## numpy 활용
df['salary'] = np.where(df.job != 'student', 'yes', 'no')
> df
name age job salary
0 John 15 student no
1 Jenny 30 developer yes
2 Nate 30 teacher yes
(참고) numpy.where
R 에서 ifelse 문과 유사하다 생각하면 된다.
> np.where(df.job != 'student', 'yes', 'no')
array(['no', 'yes', 'yes'], dtype='<U3')
> np.where(df.job != 'student')
(array([1, 2]),)
이번에는 컬럼들 간의 수식 계산 하는 방법이다.
실습을 위해 이름, 중간고사 성적, 기말고사 성적으로 이루어진 데이터프레임을 생성한다.
friend_dict = [
{'name':'John', 'midterm' : 95, 'final' : 85},
{'name': 'Jenny', 'midterm': 85, 'final': 80},
{'name': 'Nate', 'midterm': 30, 'final': 10}
]
df = pd.DataFrame(friend_dict,
columns=['name','midterm','final'])
> df
name midterm final
0 John 95 85
1 Jenny 85 80
2 Nate 30 10
중간고사 성적과 기말고사 성적을 더해 "total(총점)" 이라는 컬럼을 생성한다.
df['total'] = df.midterm + df.final
df['total'] = df['midterm'] + df['final']
두 코드 모두 같은 결과를 return 한다.
> df
name midterm final total
0 John 95 85 180
1 Jenny 85 80 165
2 Nate 30 10 40
이번에는 "average(평균 성적)" 에 대한 컬럼을 생성한다.
df['average'] = df.total/2
> df
name midterm final total average
0 John 95 85 180 90.0
1 Jenny 85 80 165 82.5
2 Nate 30 10 40 20.0
평균 점수를 가지고 Grade를 나누어 새 컬럼을 생성한다.
평균 점수가 90점 이상이면 "A", 80 이상 ~ 90 미만이면 "B", 그 아래이면 "F"라 하자.
numpy.where 로 구현하는 방법은 다음과 같다.
grades = np.where(df.average >= 90, 'A',
np.where(df.average >= 80, 'B', 'F'))
df['grade'] = grades
> grades
array(['A', 'B', 'F'], dtype='<U1')
혹은, for loop + if 문으로 구현하는 방법은 다음과 같다.
grades = []
for row in df.average :
if row >= 90 :
grades.append('A')
elif row >= 80 :
grades.append('B')
else :
grades.append('F')
df['grade'] = grades
> grades
['A', 'B', 'F']
두 코드 모두 결과는 다음과 같다.
> df
name midterm final total average grade
0 John 95 85 180 90.0 A
1 Jenny 85 80 165 82.5 B
2 Nate 30 10 40 20.0 F
이번에는 grade를 기존 grade가 F면 Fail, 아니면 Pass 로 바꾸어 주겠다.
pandas에 apply를 사용한다.
* pandas apply는 기존 R에서 apply와 같은 개념이다.
def pass_or_fail(row) :
if row != 'F' :
return "Pass"
else :
return 'Fail'
df.grade = df.grade.apply(pass_or_fail)
> df
name midterm final total average grade
0 John 95 85 180 90.0 Pass
1 Jenny 85 80 165 82.5 Pass
2 Nate 30 10 40 20.0 Fail
이미 만들어져 있는 컬럼에서 어떠한 정보를 추출하여 새로운 컬럼을 만드는 방법은 다음과 같다.
실습을 위한 날짜 데이터를 생성한다.
date_list = [
'2000-06-27', '2007-10-27'
]
df = pd.DataFrame(date_list, columns=['yyyy-mm-dd'])
> df
yyyy-mm-dd
0 2000-06-27
1 2007-10-27
위 데이터에서 "year(년도)" 만 따로 추출하여 컬럼을 만든다.
1. pandas apply
apply로 만드는 방법은 다음과 같다.
def extract_year(row) :
return row.split('-')[0]
df['year'] = df['yyyy-mm-dd'].apply(extract_year)
2. map
위에서 만든 함수를 그대로 사용하여 map으로 구현한 코드는 다음과 같다.
df['year'] = list(map(extract_year, df['yyyy-mm-dd']))
함수를 따로 정의하지 않고 바로 넣어 줄 수도 있다.
df['year'] = list(map(lambda x:x.split("-")[0], df['yyyy-mm-dd']))
모두 결과는 다음과 같다.
> df
yyyy-mm-dd year
0 2000-06-27 2000
1 2007-10-27 2007
(참고) split
> temp = "2000-06-27"
> temp.split("-")
['2000', '06', '27']
이번에는 row를 생성하는 방법이다.
df1 이라는 테이블에 df2를 합치는 코드는 다음과 같다.
friend_dict = [
{'name':'John', 'midterm' : 95, 'final' : 85},
{'name': 'Jenny', 'midterm': 85, 'final': 80},
{'name': 'Nate', 'midterm': 30, 'final': 10}
]
df1 = pd.DataFrame(friend_dict,
columns=['name','midterm','final'])
df2 = pd.DataFrame([['Ben', 50, 50]], columns=['name','midterm','final'])
> df1
name midterm final
0 John 95 85
1 Jenny 85 80
2 Nate 30 10
> df2
name midterm final
0 Ben 50 50
> df1.append(df2)
name midterm final
0 John 95 85
1 Jenny 85 80
2 Nate 30 10
0 Ben 50 50
단, df1에 다시 할당해 주지 않았기 때문에 df1에는 "Ben" 에 대한 정보가 없다.
row index가 0,1,2 -> 0 으로 합쳐지지 않고, 0,1,2 -> 3 으로 자연스럽게 합쳐지는 방법은 ignore_index=True 를 추가하는 것이다.
> df1.append(df2, ignore_index=True)
name midterm final
0 John 95 85
1 Jenny 85 80
2 Nate 30 10
3 Ben 50 50
출처
www.youtube.com/watch?v=IJOGSeHdhvQ&list=PLVNY1HnUlO25etNe08s1H1nIIbbZdJwxA&index=7
'Python > Pandas Tutorial' 카테고리의 다른 글
[Python] Pandas Tutorial :: groupby transform (groupby 결과 컬럼에 추가하기) (0) | 2020.10.07 |
---|---|
[Python] Pandas Tutorial :: groupby (0) | 2020.10.07 |
[Python] Pandas Tutorial :: Drop row or column in pandas DataFrame (0) | 2020.09.22 |
[Python] Pandas Tutorial :: Filtering(Selecting) rows, columns in pandas DataFrame (0) | 2020.09.21 |
[Python] Pandas Tutorial :: Save Pandas Data Frame to CSV file (0) | 2020.09.21 |