Python/Pandas Tutorial

[Python] Pandas Tutorial :: add row, column

슈퍼짱짱 2020. 9. 22. 16:07
반응형

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

2020/09/21 - [Python/Pandas Tutorial] - [Python] Pandas Tutorial :: Create Data Frame with Dictionary, List

2020/09/21 - [Python/Pandas Tutorial] - [Python] Pandas Tutorial :: Save Pandas Data Frame to CSV file

2020/09/21 - [Python/Pandas Tutorial] - [Python] Pandas Tutorial :: Filtering(Selecting) rows, columns in pandas DataFrame

2020/09/22 - [Python/Pandas Tutorial] - [Python] Pandas Tutorial :: Drop row or column in pandas DataFrame

 


판다스 데이터프레임에 행, 열 추가, 변경하기

먼저 판다스 라이브러리를 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

반응형