ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 03-4~03-6 데이터프레임 다루기, 시리즈와 데이터프레임의 데이터 처리하기, 데이터 저장하고 불러오기
    Do it! 판다스 입문 2022. 6. 13. 22:05

    데이터프레임 다루기

    데이터프레임도 시리즈와 마찬가지로 불린 추출과 브로드캐스팅을 할 수 있습니다. 그러면 불린 추출부터 실습해 보겠습니다.

     

     

    불린 추출과 브로드캐스팅

    1. 불린 추출하기

    데이터프레임도 불린 추출을 할 수 있습니다. 다음은 데이터프레임의 Age 열에서 Age 열의 평균보다 높은 행만 출력합니다.

    print(scientists[scientists['Age'] > scientists['Age'].mean( )])

                                  Name              Born              Died   Age      Occupation
    1              William Gosset   1876-06-13   1937-10-16    61       Statistician
    2     Florence Nightingale   1820-05-12   1910-08-13    90       Nurse
    3                   Marie Curie    1867-11-07   1934-07-04    66       Chemist
    7               Johann Gauss   1777-04-30   1855-02-23    77       Mathmatician

     

    2. 시리즈에 리스트로 참, 거짓을 전달하여 데이터를 추출했던 것을 기억하나요? 참, 거짓을 담은 리스트를 bool 벡터라고 부릅니다. 만약 bool 벡터의 길이가 데이터프레임의 행 길이보다 짧으면 bool 벡터의 길이만큼만 연산합니다. 다음은 데이터프레임의 loc 속성에 길이가 4인 bool 벡터를 전달한 것입니다.

    print(scientists.loc[[True, True, False, True]])

                              Name              Born              Died   Age      Occupation
    0      Rosaline Franklin   1920-07-25   1958-04-16    37       Chemist
    1          William Gosset   1876-06-13   1937-10-16    61       Statistician
    3               Marie Curie    1867-11-07   1934-07-04    66       Chemist

     

    3. 브로드캐스팅하기

    데이터프레임에 스칼라 연산을 적용하면 어떻게 될까요? 앞에서 시리즈에 스칼라 연산을 적용할 때는 모든 요소에 스칼라를 적용하여 연산했습니다. 데이터프레임도 마찬가지입니다. scientists 데이터프레임에 2를 곱하면 정수 데이터는 2를 곱한 숫자가 되고 문자열 데이터는 문자열이 2배로 늘어납니다.

    print(scientists * 2)

                                                                          Name                                 Born   \
    0                      Rosaline FranklinRosaline Franklin    1920-07-251920-07-25
    1                             William GossetWilliam Gosset     1876-06-131876-06-13
    2           Florence NightingaleFlorence Nightingale     1820-05-121820-05-12
    ...
    7                               Johann GaussJohann Gauss     1777-04-301777-04-30

                                          Died      Age                                              Occupation
    0       1958-04-161958-04-16        74                                     ChemistChemist
    1       1937-10-161937-10-16      122                             StatisticianStatistician
    2       1910-08-131910-08-13      180                                             NurseNurse
    ... 
    7       1855-02-231855-02-23      154                     MathmaticianMathmatician

     

     

     

     

     

    시리즈와 데이터프레임의 데이터 처리하기

    지금까지는 시리즈와 데이터프레임에서 데이터를 추출하는 여러 방법에 대해 알아보았습니다. 이번에는 시리즈와 데이터프레임에 있는 데이터를 처리하는 방법에 대해 알아보겠습니다.

     

     

    시리즈와 데이터프레임의 데이터 처리하기

    1. 열의 자료형 바꾸기와 새로운 열 추가하기

    scientists 데이터프레임의 Born과 Died 열의 자료형을 확인해 보겠습니다. 각각의 자료형은 문자열(오브젝트)입니다.

    print(scientists['Born'].dtype)

    object

    print(scientists['Died'].dtype)

    object

     

    2. 날짜를 문자열로 저장한 데이터는 시간 관련 작업을 할 수 있도록 datetime 자료형으로 바꾸는 것이 더 좋습니다. 다음은 Born과 Died 열의 자료형을 datetime이라는 자료형으로 바꾼 다음 format 속성을 '%Y-%m-%d'로 지정하여 날짜 형식을 지정한 것입니다.

    born_datetime = pd.to_datetime(scientists['Born'], format='%Y-%m-%d')
    print(born_datetime)

    0     1920-07-25
    1     1876-06-13
    2     1820-05-12
    3     1867-11-07
    4     1907-05-27
    5     1813-03-15
    6     1912-06-23
    7     1777-04-30
    Name: Born, dtype: datetime64[ns]

    died_datetime=pd.to_datetime(scientists['Died'], format='%Y-%m-%d')
    print(died_datetime)    

    0     1958-04-16
    1     1937-10-16
    2     1910-08-13
    3     1934-07-04
    4     1964-04-14
    5     1858-06-16
    6     1954-06-07
    7     1855-02-23
    Name: Died, dtype: datetime64[ns]

     

    3. 과정 2에서 각 데이터의 자료형을 datetime으로 바꿔 born_datetime, died_datetime에 저장했으니 이제 데이터프레임에 각각의 값을 새로운 열로 추가해 보겠습니다. 다음은 scientists 데이터프레임에 born_dt, died_dt 열을 추가한 것입니다. shape 속성으로 데이터프레임의 형태를 살펴보면 (8, 5)에서 (8, 7)로 2개의 열이 추가되었다는 것을 알 수 있습니다.

    scientists['born_dt'], scientists['died_dt'] = (born_datetime, died_datetime)
    print(scientists.head( ))

                                  Name              Born              Died   Age   Occupation         born_dt    \
    0          Rosaline Franklin   1920-07-25   1958-04-16    37         Chemist   1920-07-25
    1              William Gosset   1876-06-13   1937-10-16    61     Statistician   1876-06-13
    2     Florence Nightingale   1820-05-12   1910-08-13    90             Nurse   1820-05-12
    3                   Marie Curie    1867-11-07   1934-07-04    66         Chemist   1867-11-07
    4              Rachel Carson    1907-05-27   1964-04-14    56        Biologist   1907-05-27

                 died_dt
    0     1958-04-16
    1     1937-10-16
    2     1910-08-13
    3     1934-07-04
    4     1964-04-14



    print(scientists.shape)
    (8, 7)

     

    4. 이제 시간 계산을 해볼까요? died_dt 열에서 born_dt를 빼면 과학자가 얼마 동안 세상을 살다가 떠났는지 계산할 수 있습니다. 만약 결괏값이 제대로 출력되지 않는다면 과정 1~3을 다시 실행해 보세요.

    scientists['age_days_dt'] = (scientists['died_dt'] - scientists['born_dt'])
    print(scientists)

                                  Name              Born              Died   Age         Occupation    \
    0          Rosaline Franklin   1920-07-25   1958-04-16    37               Chemist   
    1              William Gosset   1876-06-13   1937-10-16    61           Statistician   
    2     Florence Nightingale   1820-05-12   1910-08-13    90                   Nurse   
    3                   Marie Curie    1867-11-07   1934-07-04    66               Chemist  
    4              Rachel Carson    1907-05-27   1964-04-14    56              Biologist 
    ...
    7               Johann Gauss   1777-04-30   1855-02-23    77       Mathmatician

                born_dt         died_dt  age_days_dt
    0    1920-07-25  1958-04-16    13779 days
    1    1876-06-13  1937-10-16    22404 days
    2    1820-05-12  1910-08-13    32964 days
    3    1867-11-07  1934-07-04    24345 days
    4    1907-05-27  1964-04-14    20777 days
    ...   
          1777-04-30  1855-02-23    28422 days  

     

    5. 시리즈, 데이터프레임의 데이터 섞기

    가끔은 데이터를 적당히 섞어야 하는 경우도 있습니다. 판다스는 시리즈나 데이터프레임의 데이터를 무작위로 섞어볼 수도 있습니다. 먼저 Age 값을 출력하여 살펴보겠습니다.

    print(scientists['Age'])

    0      37
    1      61
    2      90
    3      66
    4      56
    5      45
    6      41
    7      77
    Name: Age, dtype: int64

     

    6. Age 열의 데이터를 섞으려면 random 라이브러리를 불러와야 합니다. random 라이브러리에는 데이터를 섞어주는 shuffle 메서드가 있습니다. shuffle 메서드에 Age 열을 전달하여 데이터를 섞어보겠습니다. Age 열을 출력해 보면 인덱스 0~7에 해당하는 값이 잘 섞여 있음을 알 수 있습니다.

    import random

    random.seed(42)
    random.shuffle(scientists['Age'])
    print(scientists['Age'])

    0      66
    1      56
    2      41
    3      77
    4      90
    5      45
    6      37
    7      61
    Name: Age, dtype: int64

     

    7. 데이터프레임의 열 삭제하기

    때로는 열을 통째로 삭제해야 하는 경우도 있습니다. 먼저 scientists 데이터프레임의 열을 확인해 보겠습니다.

    print(scientists.columns)

    Index(['Name', 'Born', 'Died', 'Age', 'Occupation', 'born_dt', 'died_dt', 'age_days_dt', 'age_years_dt'],
             dtype='object')

     

    8. 데이터프레임에서 열을 삭제하려면 데이터프레임의 drop 메서드를 사용해야 합니다. shuffle 메서드로 섞은 Age 열을 삭제해 보겠습니다. drop 메서드의 첫 번째 인자에 열 이름을 리스트에 담아 전달하고 두 번째 인자에는 axis=1을 전달하면 Age 열을 삭제할 수 있습니다.

    scientists_dropped=scientists.drop(['Age'], axis=1)
    print(scientists_dropped.columns)

    Index(['Name', 'Born', 'Died',  'Occupation', 'born_dt', 'died_dt', 'age_days_dt', 'age_years_dt'],
             dtype='object')

     

     

     

     

     

    데이터 저장하고 불러오기

    지금까지 데이터를 추출하고 처리하는 방법에 대해 알아보았습니다. 일종의 '데이터 가공처리'를 거친 것이죠. 이렇게 잘 가공한 데이터는 안전하게 보관해야 다음에 또 사용할 수 있습니다. 판다스는 데이터를 저장하는 다양한 방법을 제공합니다. 여기서는 가공한 데이터를 피클, CSV, TSV 파일로 저장하고 다시 불러오는 방법에 대해 살펴봅니다.

     

     

    데이터를 피클, CSV, TSV 파일로 저장하고 불러오기.

    1. 피클로 저장하기

    피클은 데이터를 바이너리 형태로 직렬화한 오브젝트를 저장하는 방법입니다. 피클로 저장하면 스프레드시트보다 더 작은 용량으로 데이터를 저장할 수 있어 매우 편리합니다. 시리즈를 피클로 저장하려면 to_pickle 메서드를 사용하면 되는데, 이때 저장 경로를 문자열로 전달해야 합니다.

    names = scientists['Name']
    names.to_pickle('../output/scientists_names_series.pickle')

     

    2. 데이터프레임도 피클로 저장할 수 있습니다.

    scientists.to_pickle('../output/scientists_df.pickle')

     

    3. 피클은 바이너리 형태의 오브젝트이기 때문에 저장된 피클 데이터를 편집기와 같은 프로그램으로 열어보면 이상한 문자가 나타납니다. 피클 데이터는 반드시 read_pickle 메서드로 읽어 들여야 합니다.

    scientists_names_from_pickle=pd.read_pickle('../output/scientists_names_series.pickle')
    print(scientists_names_from_pickle)

    0           Rosaline Franklin
    1               William Gosset
    2      Florence Nightingale
    3                    Marie Curie
    ...

    scientists_form_pickle=pd.read_pickle('../output/scientists_df.pickle')
    print(scientists_form_pickle)

                                  Name              Born              Died   Age         Occupation    \
    0          Rosaline Franklin   1920-07-25   1958-04-16    37               Chemist   
    1              William Gosset   1876-06-13   1937-10-16    61           Statistician   
    2     Florence Nightingale   1820-05-12   1910-08-13    90                   Nurse   
    3                   Marie Curie    1867-11-07   1934-07-04    66               Chemist
    ...

     

    4. CSV 파일과 TSV 파일로 저장하기

    CSV 파일은 데이터를 쉼표로 구분하여 저장한 파일이고 TSV 파일은 데이터를 탭으로 구분하여 저장한 파일입니다. 실제로 각각의 파일을 텍스트 편집기로 열어 살펴보면 데이터가 쉼표, 탭으로 구분되어 있는 것을 알 수 있습니다. 다음은 data 폴더의 'concat_1.csv' 파일과 'gapminder.tsv' 파일을 비주얼 스튜디오 코드라는 텍스트 편집기로 열어 살펴본 것입니다. 비주얼 스튜디오 코드가 없다면 여러분의 컴퓨터에 설치된 텍스트 편집기로 파일을 열어보세요.

     

    5. to_csv 메서드로 시리즈(names)와 데이터프레임(scientists)을 CSV 파일로 저장할 수 있습니다. 이때 sep 인자를 추가하여 '\t'를 지정하고 파일의 확장자를 '.tsv'로 지정하면 TSV 파일로 저장할 수 있습니다.

    names.to_csv('../output/scientists_names_series.scv')
    scientists.to_csv('../output/scientists_df.tsv', sep='\t')

     

     

    * 시리즈와 데이터프레임을 엑셀 파일로 저장하기

    시리즈는 엑셀 구조와 맞지 않기 때문에 엑셀 파일로 저장할 수 없습니다. 엑셀 파일로 저장할 수 있는 데이터프레임으로 변환해야 합니다. 물론 데이터프레임은 엑셀 파일로 바로 저장할 수 있습니다. 단, xls 파일로 저장하려면 xlwt 라이브러리가 필요하고, xlsx 파일로 저장하려면 openpyxl 라이브러리가 필요합니다. 다음 명령어를 아나콘다 프롬프트에 입력하여 xlwt 라이브러리와 openpyxl 라이브러리를 설치하세요.

    pip install xlwt
    pip install openpyxl

     

    시리즈는 to_frame이라는 메서드를 사용해 데이터프레임으로 변환한 다음 엑셀 파일로 저장해야 합니다. 다음은 시리즈를 데이터프레임으로 변환한 다음 엑셀 파일(확장자 xls, xlsx)로 저장한 것입니다.

    names_df = name.to_frame()

    import xlwt
    names_df.to_excel('../output/scientists_names_series_df.xls')

    import openpyxl
    names_df.to_excel('../output/scientists_names_series_df.xlsx')

     

     

     

    마무리하며

    이 장에서는 시리즈와 데이터프레임을 좀 더 자세히 다루어 보았습니다. 다음 장부터 파이썬과 판다스로 그래프를 그리기 위한 기초 개념을 살펴봅니다. 데이터 분석에서 가장 중요한 요소 중 하나인 데이터 시각화에 대한 내용이 시작되는 것이죠. 만약 02, 03장을 완벽하게 이해하지 못했다면 다시 공부하고 04장을 시작하세요.

     

     

     

     

     

    출처 : "판다스 입문"

Designed by Tistory.