[회고] 신입 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 = ',')

 

반응형