[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/Data & AI

[파이썬] Pandas 기초 - DataFrame 생성 (컬럼 수정,추가, 삭제)

inu 2020. 7. 9. 18:38


DataFrame?

  • Pandas의 행렬과도 유사한 2D 데이터 객체, 하지만 개개 열의 자료형이 서로 일치하지 않을수도 있다.
  • CSV 파일, 엑셀 파일, SQL 테이블 등의 형식의 데이터를 담기에 적합하여 해당 데이터를 불러올 수 있다.
  • columns (열)과 index (행)의 속성이 있다.
  • 각 열은 Series 데이터타입이다. 즉, Series 타입을 모아 하나의 객체로 만든 것이라고 할 수 있다.

데이터 프레임 생성 : csv

import pandas as pd import numpy as np import os os.chdir(r"..\data") df = pd.read_csv('data_studentlist_en.csv', header='infer',encoding = 'latin1') print(df)
==결과== ​​​​​​​​​​​​​​​​NAME GENDER AGE GRADE ABSENCE BLOODTYPE HEIGHT WEIGHT 0 Jared Diamond M 23 3 Y O 165.3 68.2 1 Sarah O'Donnel F 22 2 N AB 170.1 53.0 2 Brian Martin M 24 4 N B 175.0 80.1 3 David Hassel M 23 3 N AB 182.1 85.7 4 Clara Rodriquez F 20 1 Y A 168.0 49.5 5 Jennifer Lorentz F 21 2 N O 162.0 52.0 6 Susan Clark F 22 1 N O 155.2 45.3 7 Margareth Jones F 23 1 N A 176.9 55.0 8 John Bertsch M 23 3 N B 178.5 64.2 9 Jake Timmerman M 22 2 N B 176.1 61.3 10 Joshua Connor M 24 4 Y O 167.1 62.0 11 John Matsuda M 22 2 N AB 180.0 75.8 12 Eddy Johnson M 21 1 N A 162.2 55.3 13 Rebecah Anderson F 23 3 N O 176.1 53.1 14 Linda Carter F 22 2 N B 158.2 45.2 15 Richard Swayze M 24 4 Y B 168.6 70.2 16 Andrew Daley M 21 1 N A 169.2 62.2
  • read_csv 함수를 사용해 csv 파일로부터 데이터를 받아왔다. (data_studentlist_en.csv)
  • read_csv 파라미터 중 header는 파일 내부에 header가 포함되어 있는지 여부를 확인한다. 파일 내부에 col이름이 제대로 부여되어 있다면 'infer'를 입력한다.
  • read_csv 파라미터 중 encoding은 문자 처리방법을 뜻하는데, 문자가 깨지지않도록 적절한 인코딩 방식을 선택해야 한다. 영어만으로 이루어진 데이터는 왠만해선 깨지지 않지만 한글이 섞인 경우 인코딩방식이 적절하지 않으면 깨진다.
  • 데이터프레임은 numpy와 유사하게 shape, size, ndim 값을 보유하고 있다.

데이터 프레임 생성 : 엑셀

dfx = pd.read_excel('data_studentlist_en.xlsx', sheet_name='Sheet1') print(dfx.head(5))
==결과== ​​​​​​​​​​​​​​name gender age grade absence bloodtype height weight 0 Jared Diamond M 23 3 Y O 165.3 68.2 1 Sarah O'Donnel F 22 2 N AB 170.1 53.0 2 Brian Martin M 24 4 N B 175.0 80.1 3 David Hassel M 23 3 N AB 182.1 85.7 4 Clara Rodriquez F 20 1 Y A 168.0 49.5

데이터 프레임 생성 : 딕셔너리, numpy배열

data = { 'NAME' : ['Jake', 'Jennifer', 'Paul', 'Andrew'], 'AGE': [24,21,25,19], 'GENDER':['M','F','M','M']} df4 = pd.DataFrame(data) print(df4)
==결과== ​​​​​​​NAME AGE GENDER 0 Jake 24 M 1 Jennifer 21 F 2 Paul 25 M 3 Andrew 19 M
df5 = pd.DataFrame(np.random.rand(10,5), columns=['A','B','C','D','E']) print(df5)
==결과== ​​​​​​​​​​A B C D E 0 0.106702 0.911029 0.388986 0.581598 0.651019 1 0.325734 0.119166 0.930721 0.465581 0.163212 2 0.129590 0.323682 0.865881 0.446479 0.811059 3 0.020945 0.234791 0.259962 0.467398 0.915858 4 0.294922 0.482267 0.308855 0.465347 0.891606 5 0.320381 0.771138 0.923869 0.659314 0.910071 6 0.521168 0.206045 0.353384 0.992611 0.077367 7 0.226788 0.676189 0.331822 0.186582 0.376329 8 0.878460 0.011057 0.917314 0.339951 0.021992 9 0.371885 0.017130 0.310011 0.472060 0.512745

데이터 프레임 출력

print(df.info())
==결과== <class 'pandas.core.frame.DataFrame'> RangeIndex: 17 entries, 0 to 16 Data columns (total 8 columns): ​# Column Non-Null Count Dtype --- ------ -------------- ----- 0 NAME 17 non-null object 1 GENDER 17 non-null object 2 AGE 17 non-null int64 3 GRADE 17 non-null int64 4 ABSENCE 17 non-null object 5 BLOODTYPE 17 non-null object 6 HEIGHT 17 non-null float64 7 WEIGHT 17 non-null float64 dtypes: float64(2), int64(2), object(4) memory usage: 1.2+ KB None
print(df.describe())
==결과== ​​​​​​​​​​​​​AGE GRADE HEIGHT WEIGHT count 17.000000 17.000000 17.000000 17.000000 mean 22.352941 2.294118 170.035294 61.064706 std 1.169464 1.104802 7.849756 11.851685 min 20.000000 1.000000 155.200000 45.200000 25% 22.000000 1.000000 165.300000 53.000000 50% 22.000000 2.000000 169.200000 61.300000 75% 23.000000 3.000000 176.100000 68.200000 max 24.000000 4.000000 182.100000 85.700000
print(df.head(3)) print(df.tail(3))
==결과== ​​​​​​​​​​​​​NAME GENDER AGE GRADE ABSENCE BLOODTYPE HEIGHT WEIGHT 0 Jared Diamond M 23 3 Y O 165.3 68.2 1 Sarah O'Donnel F 22 2 N AB 170.1 53.0 2 Brian Martin M 24 4 N B 175.0 80.1 ​​​​​​​​​​​​​​NAME GENDER AGE GRADE ABSENCE BLOODTYPE HEIGHT WEIGHT 14 Linda Carter F 22 2 N B 158.2 45.2 15 Richard Swayze M 24 4 Y B 168.6 70.2 16 Andrew Daley M 21 1 N A 169.2 62.2
  • info는 데이터의 현 정보를 요약해서 보여준다.
  • describe는 데이터의 통계 정보를 요약해서 보여준다.
  • head와 tail은 각각 상단과 하단을 잘라 보여준다.

데이터 프레임 컬럼이름 변경

df.columns = ['name', 'gender', 'age', 'grade', 'absence', 'bloodtype', 'height', 'weight'] print(df.head(3))
==결과== ​​​​​​​​​​​​​name gender age grade absence bloodtype height weight 0 Jared Diamond M 23 3 Y O 165.3 68.2 1 Sarah O'Donnel F 22 2 N AB 170.1 53.0 2 Brian Martin M 24 4 N B 175.0 80.1
  • colums 값을 수정하여 컬럼의 내용을 변경할 수 있다.

데이터 프레임 컬럼 삭제

df.drop(columns=['NAME','GENDER'], inplace=True)
==결과== ​​​​AGE GRADE ABSENCE BLOODTYPE HEIGHT WEIGHT 0 23 3 Y O 165.3 68.2 1 22 2 N AB 170.1 53.0 2 24 4 N B 175.0 80.1 3 23 3 N AB 182.1 85.7 4 20 1 Y A 168.0 49.5 5 21 2 N O 162.0 52.0 6 22 1 N O 155.2 45.3 7 23 1 N A 176.9 55.0 8 23 3 N B 178.5 64.2 9 22 2 N B 176.1 61.3 10 24 4 Y O 167.1 62.0 11 22 2 N AB 180.0 75.8 12 21 1 N A 162.2 55.3 13 23 3 N O 176.1 53.1 14 22 2 N B 158.2 45.2 15 24 4 Y B 168.6 70.2 16 21 1 N A 169.2 62.2
  • drop 명령어는 컬럼을 삭제해준다. inplace를 true로 하면 항구적으로 df 자체에서 컬럼을 삭제한다.
  • cf. index = [0, 1, 2] 등으로 명령어를 주면 행도 삭제가 가능하다.

데이터 프레임 컬럼 추가

df['BMI'] = 10000*df['WEIGHT']/df['HEIGHT']**2 print(df.iloc[0:5, 1:]) # 출력문의 일종
​​GENDER AGE GRADE ABSENCE BLOODTYPE HEIGHT WEIGHT BMI 0 M 23 3 Y O 165.3 68.2 24.959660 1 F 22 2 N AB 170.1 53.0 18.317544 2 M 24 4 N B 175.0 80.1 26.155102 3 M 23 3 N AB 182.1 85.7 25.844071 4 F 20 1 Y A 168.0 49.5 17.538265
  • 위와 같은 방법으로 새로운 칼럼을 추가할 수도 있다.

파일로 출력

df.to_csv('data_mine.csv',index=False) dfx.to_excel('data_studentlist_en2.xlsx',sheet_name='NewSheet',index=False)
  • 현재 디렉토리에 파일을 저장한다.
  • index값은 index를 포함하여 저장할지를 결정한다.
  • 엑셀파일의 경우 sheet_name 파라미터에서 저장될 sheet도 결정한다.
  • 위 예시엔 명시하지 않았지만, sep 옵션을 주면 저장 형식에서 각 컬럼 value별 구분 문자를 바꿀 수 있다. (default = ',')