ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PlayData - Day 10] Pandas - 구조적 데이터 표시와 처리
    [플레이데이터] 2023. 1. 6. 10:26

    1. K-Digital Training 과정

    • 빅데이터 기반 지능형SW 및 MLOps 개발자 양성과정 19기 (2023/01/03 - Day 10)

    2. 목차

    1. 구조적 데이터 생성하기
    2. 데이터 연산
    3. 데이터를 원하는 대로 선택하기
    4. 데이터 통합하기
    5. 데이터 파일을 읽고 쓰기

    3. 수업 내용

     

    1. 구조적 데이터 생성하기

    Series를 활용한 데이터 생성

    s = pd.Series(seq_data)

    import pandas as pd

    Series 생성하기
    세로축 라벨을 index, 입력한 시퀀스 데이터를 values 라고 한다.

    s1 = pd.Series([10,20,30,40,50])
    s1 # index 값을 바로 생성해준다. 2차원으로 변경해서 입력한 시퀀스 데이터를 value로 바로 넣어준다.
    >>> 
    0    10
    1    20
    2    30
    3    40
    4    50
    dtype: int64

    index와 values 분리해서 가져오기

    s1.index
    >>> RangeIndex(start=0, stop=5, step=1)
    s1.values
    >>> array([10, 20, 30, 40, 50], dtype=int64)

    혼합된 리스트 생성

    s2 = pd.Series(['a','b','c',1,2,3])
    s2
    >>> 
    0    a
    1    b
    2    c
    3    1
    4    2
    5    3
    dtype: object

    데이터가 없을 경우 NumPy를 import 하여 데이터 없음을 표기할 수 있음

    import numpy as np
    
    s3 = pd.Series([np.nan, 10, 30])
    s3 # NaN 값은 float로 처리된다.
    >>> 
    0     NaN
    1    10.0
    2    30.0
    dtype: float64

    인자로 index 추가
    s = pd.Series(seq_data, index = index_seq)
    seq_data와 index_seq의 갯수가 일치해야한다

    index_date = ['2018-10-07','2018-10-08','2018-10-09','2018-10-10']
    s4 = pd.Series([200, 195, np.nan, 205], index = index_date)
    s4
    >>> 
    2018-10-07    200.0
    2018-10-08    195.0
    2018-10-09      NaN
    2018-10-10    205.0
    dtype: float64

    딕셔너리를 이용하면 데이터와 index를 함께 입력 가능

    s5 = pd.Series({'국어':100, '영어':95, '수학':90})
    s5
    >>> 
    국어    100
    영어     95
    수학     90
    dtype: int64

    날짜 자동 생성: date_range

    pd.date_range(start = None, end = None, periods = None, freq = 'D')

    pd.date_range(start = '2019-01-01', end = '2019-01-07')
    >>> 
    DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
                   '2019-01-05', '2019-01-06', '2019-01-07'],
                  dtype='datetime64[ns]', freq='D')

    다른 형식으로 입력하기

    pd.date_range(start = '2019-01-01', periods = 7)
    >>> 
    DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
                   '2019-01-05', '2019-01-06', '2019-01-07'],
                  dtype='datetime64[ns]', freq='D')
    pd.date_range(start = '2019-01-01', periods = 4, freq = '2D') # 이틀 단위로 올라감
    >>> 
    DatetimeIndex(['2019-01-01', '2019-01-03', '2019-01-05', '2019-01-07'], dtype='datetime64[ns]', freq='2D')

    요일 시작 기준 일주일 주기 freq = 'W', freq = 'W-MON'

    pd.date_range(start='2023-01-01', periods=5, freq='W-mon') # 월요일 날짜만 다섯개
    >>> 
    DatetimeIndex(['2023-01-02', '2023-01-09', '2023-01-16', '2023-01-23',
                   '2023-01-30'],
                  dtype='datetime64[ns]', freq='W-MON')

    업무 월말 날짜 기준 주기 freq='BM', freq='2BM'

    pd.date_range(start='2023-01-01', periods=12, freq='2BM') # 2달마다 월말
    >>> 
    DatetimeIndex(['2023-01-31', '2023-03-31', '2023-05-31', '2023-07-31',
                   '2023-09-29', '2023-11-30', '2024-01-31', '2024-03-29',
                   '2024-05-31', '2024-07-31', '2024-09-30', '2024-11-29'],
                  dtype='datetime64[ns]', freq='2BM')

    분기 시작 기준 날짜 주기 freq = 'QS', freq = '2QS'

    pd.date_range(start='2019-01-01', periods=4, freq='QS')
    >>> 
    DatetimeIndex(['2019-01-01', '2019-04-01', '2019-07-01', '2019-10-01'], 
    				dtype='datetime64[ns]', freq='QS-JAN')

    연도 기준 날짜 주기 freq='AS', freq='2AS'

    pd.date_range(start='2019-01-01', periods=3, freq='AS')
    >>> 
    DatetimeIndex(['2019-01-01', '2020-01-01', '2021-01-01'], dtype='datetime64[ns]', freq='AS-JAN')

    시간 기준 주기 freq = 'H'

    pd.date_range(start='2023-01-03 09:00', periods=10, freq='H')
    >>> 
    DatetimeIndex(['2023-01-03 09:00:00', '2023-01-03 10:00:00',
                   '2023-01-03 11:00:00', '2023-01-03 12:00:00',
                   '2023-01-03 13:00:00', '2023-01-03 14:00:00',
                   '2023-01-03 15:00:00', '2023-01-03 16:00:00',
                   '2023-01-03 17:00:00', '2023-01-03 18:00:00'],
                  dtype='datetime64[ns]', freq='H')

    업무 시간 기준 주기 freq = 'BH' # Business Hour

    pd.date_range(start='2019-01-01 08:00', periods=10, freq='BH')
    >>> 
    DatetimeIndex(['2019-01-01 09:00:00', '2019-01-01 10:00:00',
                   '2019-01-01 11:00:00', '2019-01-01 12:00:00',
                   '2019-01-01 13:00:00', '2019-01-01 14:00:00',
                   '2019-01-01 15:00:00', '2019-01-01 16:00:00',
                   '2019-01-02 09:00:00', '2019-01-02 10:00:00'],
                  dtype='datetime64[ns]', freq='BH')

    30분 단위로 시간을 생성하기 freq = '30min', freq = '30T'

    pd.date_range(start='2019-01-01 08:00', periods=4, freq='30min')
    >>> 
    DatetimeIndex(['2019-01-01 08:00:00', '2019-01-01 08:30:00',
                   '2019-01-01 09:00:00', '2019-01-01 09:30:00'],
                  dtype='datetime64[ns]', freq='30T')
    pd.date_range(start='2019-01-01 08:00', periods=4, freq='30T')
    >>> 
    DatetimeIndex(['2019-01-01 08:00:00', '2019-01-01 08:30:00',
                   '2019-01-01 09:00:00', '2019-01-01 09:30:00'],
                  dtype='datetime64[ns]', freq='30T')

    초 단위로 생성하기 freq = '10S'

    pd.date_range(start='2019-01-01 08:00:10', periods=4, freq='10S')
    >>> 
    DatetimeIndex(['2019-01-01 08:00:10', '2019-01-01 08:00:20',
                   '2019-01-01 08:00:30', '2019-01-01 08:00:40'],
                  dtype='datetime64[ns]', freq='10S')

    Series의 index를 지정할 때 날짜별/시간별로 지정하기 위해 date_range를 사용한다.

    index_date = pd.date_range(start='2019-03-01', periods=5, freq='D')
    pd.Series([51, 62, 55, 49, 58], index = index_date)
    >>> 
    2019-03-01    51
    2019-03-02    62
    2019-03-03    55
    2019-03-04    49
    2019-03-05    58
    Freq: D, dtype: int64

    DataFrame을 활용한 데이터 생성

    2차원 데이터를 위해서 DataFrame을 사용
    df = pd.DataFrame(data[, index=index_data, columns = columns_data])

    import pandas as pd
    
    pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]])
      0 1 2
    0 1 2 3
    1 4 5 6
    2 7 8 9

    NumPy의 배열데이터를 활용한 DataFrame 생성

    import numpy as np
    import pandas as pd
    
    data_list = np.array([[10,20,30], [40,50,60], [70,80,90]])
    pd.DataFrame(data_list)
      0 1 2
    0 10 20 30
    1 40 50 60
    2 70 80 90

    index와 columns 지정

    data = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])
    index_date = pd.date_range('2019-09-01', periods=4)
    columns_list = ['A','B','C']
    pd.DataFrame(data, index=index_date, columns=columns_list)
      A B C
    2019-09-01 1 2 3
    2019-09-02 4 5 6
    2019-09-03 7 8 9
    2019-09-04 10 11 12

    딕셔너리 타입으로 2차원 데이터를 입력했을 경우

    table_data = {'연도':[2015, 2016, 2016, 2017, 2017],
                 '지사':['한국','한국','미국','한국','미국'],
                 '고객 수':[200,250,450,300,500]}
    table_data
    >>> 
    {'연도': [2015, 2016, 2016, 2017, 2017],
     '지사': ['한국', '한국', '미국', '한국', '미국'],
     '고객 수': [200, 250, 450, 300, 500]}
    pd.DataFrame(table_data)
      연도 지사 고객 수
    0 2015 한국 200
    1 2016 한국 250
    2 2016 미국 450
    3 2017 한국 300
    4 2017 미국 500

    지정한 순서대로 출력하기: 중요도 순서, 오름차순으로 정렬된다.

    df = pd.DataFrame(table_data, columns=['연도','고객 수', '지사'])
    
    df
      연도 고객 수 지사
    0 2015 200 한국
    1 2016 250 한국
    2 2016 450 미국
    3 2017 300 한국
    4 2017 500 미국

    DataFrame 데이터에서 index, columns, values를 각각 구하기

    df.index
    >>> RangeIndex(start=0, stop=5, step=1)
    df.columns
    >>> Index(['연도', '고객 수', '지사'], dtype='object')
    df.values
    >>> 
    array([[2015, 200, '한국'],
           [2016, 250, '한국'],
           [2016, 450, '미국'],
           [2017, 300, '한국'],
           [2017, 500, '미국']], dtype=object)

     

    2. 데이터 연산

    pandas의 Series()와 DataFrame()으로 생성한 데이터끼리는 사칙 연산을 할 수 있다.

    s1 = pd.Series([1,2,3,4,5])
    s2 = pd.Series([10,20,30,40,50])
    s1 + s2
    >>> 
    0    11
    1    22
    2    33
    3    44
    4    55
    dtype: int64
    s2-s1
    >>> 
    0     9
    1    18
    2    27
    3    36
    4    45
    dtype: int64
    s1*s2
    >>> 
    0     10
    1     40
    2     90
    3    160
    4    250
    dtype: int64
    s2/s1
    >>> 
    0    10.0
    1    10.0
    2    10.0
    3    10.0
    4    10.0
    dtype: float64
    s3 = pd.Series([1,2,3,4])
    s4 = pd.Series([10,20,30,40,50])
    s3+s4 # 짝지어지는 값이 없으면 NaN으로 출력된다
    >>> 
    0    11.0
    1    22.0
    2    33.0
    3    44.0
    4     NaN
    dtype: float64
    s4-s3
    >>> 
    0     9.0
    1    18.0
    2    27.0
    3    36.0
    4     NaN
    dtype: float64
    s3*s4
    >>> 
    0     10.0
    1     40.0
    2     90.0
    3    160.0
    4      NaN
    dtype: float64
    s4/s3
    >>> 
    0    10.0
    1    10.0
    2    10.0
    3    10.0
    4     NaN
    dtype: float64

    DataFrame 데이터끼리 사칙 연산

    table_data1 = {'A':[1,2,3,4,5],
                  'B': [10,20,30,40,50],
                  'C': [100,200,300,400,500]}
    df1 = pd.DataFrame(table_data1)
    df1
      A B C
    0 1 10 100
    1 2 20 200
    2 3 30 300
    3 4 40 400
    4 5 50 500
    table_data2 = {'A':[6,7,8],
                  'B':[60,70,80],
                  'C':[600,700,800]}
    df2 = pd.DataFrame(table_data2)
    df2
      A B C
    0 6 60 600
    1 7 70 700
    2 8 80 800
    df1 + df2 # 같은 행과 열에 있는 값끼리는 덧셈이 된다.
      A B C
    0 7.0 70.0 700.0
    1 9.0 90.0 900.0
    2 11.0 110.0 1100.0
    3 NaN NaN NaN
    4 NaN NaN NaN

    데이터의 총합, 평균, 표준 편차 등도 쉽게 구할 수 있다

    table_data3 = {'봄':  [256.5, 264.3, 215.9, 223.2, 312.8],
                  '여름': [770.6, 567.5, 599.8, 387.1, 446.2],
                  '가을': [363.5, 231.2, 293.1, 247.7, 381.6],
                  '겨울': [139.3, 59.9, 76.9, 109.1, 108.1]}
    columns_list = ['봄', '여름', '가을', '겨울']
    index_list = ['2012', '2013', '2014', '2015', '2016']
    
    df3 = pd.DataFrame(table_data3, columns = columns_list, index = index_list)
    df3
      여름 가을 겨울
    2012 256.5 770.6 363.5 139.3
    2013 264.3 567.5 231.2 59.9
    2014 215.9 599.8 293.1 76.9
    2015 223.2 387.1 247.7 109.1
    2016 312.8 446.2 381.6 108.1

    평균과 표준편차

    df3.mean()
    >>> 
    봄     254.54
    여름    554.24
    가을    303.42
    겨울     98.66
    dtype: float64
    df3.std()
    >>> 
    봄      38.628267
    여름    148.888895
    가을     67.358496
    겨울     30.925523
    dtype: float64

    연도별 평균 강수량과 표준편차 구하기
    axis = 0이면 열별로, 1이면 행별로 연산을 수행(지정하지 않으면 0)

    df3.mean(axis=1)
    >>> 
    2012    382.475
    2013    280.725
    2014    296.425
    2015    241.775
    2016    312.175
    dtype: float64
    df3.std(axis=1)
    >>> 
    2012    274.472128
    2013    211.128782
    2014    221.150739
    2015    114.166760
    2016    146.548658
    dtype: float64
    df3.describe()
      여름 가을 겨울
    count 5.000000 5.000000 5.000000 5.000000
    mean 254.540000 554.240000 303.420000 98.660000
    std 38.628267 148.888895 67.358496 30.925523
    min 215.900000 387.100000 231.200000 59.900000
    25% 223.200000 446.200000 247.700000 76.900000
    50% 256.500000 567.500000 293.100000 108.100000
    75% 264.300000 599.800000 363.500000 109.100000
    max 312.800000 770.600000 381.600000 139.300000

     

    3. 데이터를 원하는대로 선택하기

    KTX_data = {'경부선 KTX': [39060, 39896, 42005, 43621, 41702, 41266, 32427],
                '호남선 KTX': [7313, 6967, 6873, 6626, 8675, 10622, 9228],
                '경전선 KTX': [3627, 4168, 4088, 4424, 4606, 4984, 5570],
                '전라선 KTX': [309, 1771, 1954, 2244, 3146, 3945, 5766],
                '동해선 KTX': [np.nan,np.nan, np.nan, np.nan, 2395, 3786, 6667]}
    col_list = ['경부선 KTX','호남선 KTX','경전선 KTX','전라선 KTX','동해선 KTX']
    index_list = ['2011','2012','2013','2014','2015','2016','2017']
    
    df_KTX = pd.DataFrame(KTX_data, columns = col_list, index = index_list)
    df_KTX
      경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
    2011 39060 7313 3627 309 NaN
    2012 39896 6967 4168 1771 NaN
    2013 42005 6873 4088 1954 NaN
    2014 43621 6626 4424 2244 NaN
    2015 41702 8675 4606 3146 2395.0
    2016 41266 10622 4984 3945 3786.0
    2017 32427 9228 5570 5766 6667.0
    type(df_KTX.index[0])
    >>> numpy.int64
    df_KTX.columns
    >>> 
    Index(['경부선 KTX', '호남선 KTX', '경전선 KTX', '전라선 KTX', '동해선 KTX'], dtype='object')
    df_KTX.values
    >>> 
    array([[39060.,  7313.,  3627.,   309.,    nan],
           [39896.,  6967.,  4168.,  1771.,    nan],
           [42005.,  6873.,  4088.,  1954.,    nan],
           [43621.,  6626.,  4424.,  2244.,    nan],
           [41702.,  8675.,  4606.,  3146.,  2395.],
           [41266., 10622.,  4984.,  3945.,  3786.],
           [32427.,  9228.,  5570.,  5766.,  6667.]])

    데이터 일부만 확인하기
    dataframe_data.head([n])
    dataframe_data.tail([n])

    df_KTX.head()
      경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
    2011 39060 7313 3627 309 NaN
    2012 39896 6967 4168 1771 NaN
    2013 42005 6873 4088 1954 NaN
    2014 43621 6626 4424 2244 NaN
    2015 41702 8675 4606 3146 2395.0
    df_KTX.head(3)
      경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
    2011 39060 7313 3627 309 NaN
    2012 39896 6967 4168 1771 NaN
    2013 42005 6873 4088 1954 NaN
    df_KTX.tail(2)
      경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
    2016 41266 10622 4984 3945 3786.0
    2017 32427 9228 5570 5766 6667.0

    DataFrame에서 연속된 구간의 행 데이터를 선택하기
    DataFrame_data[행 시작 위치 : 행 끝 위치]

    df_KTX[1:2]
      경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
    2012 39896 6967 4168 1771 NaN
    df_KTX[2:5] # 행 위치 2에서 4까지의 행 데이터 선택
      경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
    2013 42005 6873 4088 1954 NaN
    2014 43621 6626 4424 2244 NaN
    2015 41702 8675 4606 3146 2395.0

    index를 지정하기
    DataFrame_data.loc[index_name]

    df_KTX.loc[2011]
    >>> 
    경부선 KTX    39060.0
    호남선 KTX     7313.0
    경전선 KTX     3627.0
    전라선 KTX      309.0
    동해선 KTX        NaN
    Name: 2011, dtype: float64
    df_KTX.loc['2011':'2016']
      경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
    2011 39060 7313 3627 309 NaN
    2012 39896 6967 4168 1771 NaN
    2013 42005 6873 4088 1954 NaN
    2014 43621 6626 4424 2244 NaN
    2015 41702 8675 4606 3146 2395.0
    2016 41266 10622 4984 3945 3786.0
    # 구간을 지정해서 출력하기
    ?df_KTX.loc

    하나의 열 데이터를 출력하기

    df_KTX['경부선 KTX']
    >>> 
    2011    39060
    2012    39896
    2013    42005
    2014    43621
    2015    41702
    2016    41266
    2017    32427
    Name: 경부선 KTX, dtype: int64
    df_KTX['경부선 KTX']['2012':'2014']
    >>> 
    2012    39896
    2013    42005
    2014    43621
    Name: 경부선 KTX, dtype: int64
    KTX_data = {'경부선 KTX': [39060, 39896, 42005, 43621, 41702, 41266, 32427],
                '호남선 KTX': [7313, 6967, 6873, 6626, 8675, 10622, 9228],
                '경전선 KTX': [3627, 4168, 4088, 4424, 4606, 4984, 5570],
                '전라선 KTX': [309, 1771, 1954, 2244, 3146, 3945, 5766],
                '동해선 KTX': [np.nan,np.nan, np.nan, np.nan, 2395, 3786, 6667]}
    col_list = ['경부선 KTX','호남선 KTX','경전선 KTX','전라선 KTX','동해선 KTX']
    index_list = [11, 12, 13, 14, 15, 16, 17]
    
    df_KTX = pd.DataFrame(KTX_data, columns = col_list, index = index_list)
    df_KTX
      경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
    11 39060 7313 3627 309 NaN
    12 39896 6967 4168 1771 NaN
    13 42005 6873 4088 1954 NaN
    14 43621 6626 4424 2244 NaN
    15 41702 8675 4606 3146 2395.0
    16 41266 10622 4984 3945 3786.0
    17 32427 9228 5570 5766 6667.0
    df_KTX['경부선 KTX'][0:3]
    # index_list가 int일 때 index가 제대로 먹히지 않는다..? 왜냐면... Series화 되어서...!?
    >>> 
    11    39060
    12    39896
    13    42005
    Name: 경부선 KTX, dtype: int64
    df_KTX['경부선 KTX']
    >>> 
    11    39060
    12    39896
    13    42005
    14    43621
    15    41702
    16    41266
    17    32427
    Name: 경부선 KTX, dtype: int64
    KTX_data = {'경부선 KTX': [39060, 39896, 42005, 43621, 41702, 41266, 32427],
                '호남선 KTX': [7313, 6967, 6873, 6626, 8675, 10622, 9228],
                '경전선 KTX': [3627, 4168, 4088, 4424, 4606, 4984, 5570],
                '전라선 KTX': [309, 1771, 1954, 2244, 3146, 3945, 5766],
                '동해선 KTX': [np.nan,np.nan, np.nan, np.nan, 2395, 3786, 6667]}
    col_list = ['경부선 KTX','호남선 KTX','경전선 KTX','전라선 KTX','동해선 KTX']
    index_list = ['11', '12', '13', '14', '15', '16', '17']
    
    df_KTX = pd.DataFrame(KTX_data, columns = col_list, index = index_list)
    df_KTX
      경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
    11 39060 7313 3627 309 NaN
    12 39896 6967 4168 1771 NaN
    13 42005 6873 4088 1954 NaN
    14 43621 6626 4424 2244 NaN
    15 41702 8675 4606 3146 2395.0
    16 41266 10622 4984 3945 3786.0
    17 32427 9228 5570 5766 6667.0
    df_KTX['경부선 KTX']['11':'13']
    # index_list가 int일 때 index가 제대로 먹히지 않는다..? 왜냐면... Series화 되어서...!?
    # Series일 때도 index 쓰고 싶으면 str로 하자
    >>> 
    11    39060
    12    39896
    13    42005
    Name: 경부선 KTX, dtype: int64
    df_KTX['경부선 KTX'][0:3]
    >>> 
    11    39060
    12    39896
    13    42005
    Name: 경부선 KTX, dtype: int64


    행과 열을 바꾸기

    df_KTX.T # 자동으로 저장되진 않는다.
      2011 2012 2013 2014 2015 2016 2017
    경부선 KTX 39060.0 39896.0 42005.0 43621.0 41702.0 41266.0 32427.0
    호남선 KTX 7313.0 6967.0 6873.0 6626.0 8675.0 10622.0 9228.0
    경전선 KTX 3627.0 4168.0 4088.0 4424.0 4606.0 4984.0 5570.0
    전라선 KTX 309.0 1771.0 1954.0 2244.0 3146.0 3945.0 5766.0
    동해선 KTX NaN NaN NaN NaN 2395.0 3786.0 6667.0
    df_KTX_T=df_KTX.T
    df_KTX_T
      2011 2012 2013 2014 2015 2016 2017
    경부선 KTX 39060.0 39896.0 42005.0 43621.0 41702.0 41266.0 32427.0
    호남선 KTX 7313.0 6967.0 6873.0 6626.0 8675.0 10622.0 9228.0
    경전선 KTX 3627.0 4168.0 4088.0 4424.0 4606.0 4984.0 5570.0
    전라선 KTX 309.0 1771.0 1954.0 2244.0 3146.0 3945.0 5766.0
    동해선 KTX NaN NaN NaN NaN 2395.0 3786.0 6667.0

    열의 순서를 지정하여 변경하기

    df_KTX[['동해선 KTX', '전라선 KTX', '경전선 KTX', '호남선 KTX', '경부선 KTX']]
      동해선 KTX 전라선 KTX 경전선 KTX 호남선 KTX 경부선 KTX
    2011 NaN 309 3627 7313 39060
    2012 NaN 1771 4168 6967 39896
    2013 NaN 1954 4088 6873 42005
    2014 NaN 2244 4424 6626 43621
    2015 2395.0 3146 4606 8675 41702
    2016 3786.0 3945 4984 10622 41266
    2017 6667.0 5766 5570 9228 32427

     

    4. 데이터 통합하기

    세로 방향으로 통합하기

    DataFrame_data1.append(DataFrame_data2 [,ignore_index=True])

    import numpy as np
    import pandas as pd
    
    df1 = pd.DataFrame({'Class1':[95,92,98,100],
                       'Class2':[91,93,97,99]})
    df1

     

      Class1 Class2
    0 95 91
    1 92 93
    2 98 97
    3 100 99
    df2 = pd.DataFrame({'Class1':[87,89],
                       'Class2':[85,90]})
    df2
      Class1 Class2
    0 87 85
    1 89 90
    df1.append(df2)
    >>> 
    C:\Users\Playdata\AppData\Local\Temp\ipykernel_10056\3062608662.py:1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
      df1.append(df2)
      Class1 Class2
    0 95 91
    1 92 93
    2 98 97
    3 100 99
    0 87 85
    1 89 90
    ?pd.concat
    pd.concat([df1,df2])
      Class1 Class2
    0 95 91
    1 92 93
    2 98 97
    3 100 99
    0 87 85
    1 89 90
    pd.concat([df1,df2], ignore_index=True)
      Class1 Class2
    0 95 91
    1 92 93
    2 98 97
    3 100 99
    4 87 85
    5 89 90
    df1.append(df2, ignore_index=True)
    >>> 
    C:\Users\Playdata\AppData\Local\Temp\ipykernel_10056\2149412069.py:1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
      df1.append(df2, ignore_index=True)
      Class1 Class2
    0 95 91
    1 92 93
    2 98 97
    3 100 99
    4 87 85
    5 89 90
    df3 = pd.DataFrame({'Class1':[96,83]})
    df3
      Class1
    0 96
    1 83
    df2.append(df3, ignore_index=True)
    >>> 
    C:\Users\Playdata\AppData\Local\Temp\ipykernel_10056\1427453207.py:1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
      df2.append(df3, ignore_index=True)
      Class1 Class2
    0 87 85.0
    1 89 90.0
    2 96 NaN
    3 83 NaN

    가로 방향으로 통합하기

    df4 = pd.DataFrame({'Class3':[93,91,95,98]})
    df4
      Class3
    0 93
    1 91
    2 95
    3 98
    df1.join(df4)
      Class1 Class2 Class3
    0 95 91 93
    1 92 93 91
    2 98 97 95
    3 100 99 98

    index의 라벨을 지정한 경우에도 index가 맞다면 join이 가능

    index_label = ['a','b','c','d']
    df1a = pd.DataFrame({'Class1':[95,92,98,100],
                        'Class2':[91,93,97,95]}, index = index_label)
    df4a = pd.DataFrame({'Class3':[93,91,95,98]}, index = index_label)
    
    df1a.join(df4a)
      Class1 Class2 Class3
    a 95 91 93
    b 92 93 91
    c 98 97 95
    d 100 95 98
    df5 = pd.DataFrame({'Class4':[82,92]})
    df5
      Class4
    0 82
    1 92
    df1.join(df5)
      Class1 Class2 Class4
    0 95 91 82.0
    1 92 93 92.0
    2 98 97 NaN
    3 100 99 NaN

    특정 열을 기준으로 통합하기

    두 개의 데이터에 공통된 열(=key)이 있다면 이 열을 기준으로 통합 가능
    DataFrame_left_data.merge(DataFrame_right_data)

    df_A_B = pd.DataFrame({'판매월': ['1월', '2월', '3월', '4월'],
                           '제품A': [100, 150, 200, 130],
                           '제품B': [90, 110, 140, 170]})
    df_A_B
      판매월 제품A 제품B
    0 1월 100 90
    1 2월 150 110
    2 3월 200 140
    3 4월 130 170
    df_C_D = pd.DataFrame({'판매월': ['1월', '2월', '3월', '4월'],
                           '제품C': [112, 141, 203, 134],
                           '제품D': [90, 110, 140, 170]})
    df_C_D
      판매월 제품C 제품D
    0 1월 112 90
    1 2월 141 110
    2 3월 203 140
    3 4월 134 170
    df_A_B.merge(df_C_D) # 판매월이 동일
      판매월 제품A 제품B 제품C 제품D
    0 1월 100 90 112 90
    1 2월 150 110 141 110
    2 3월 200 140 203 140
    3 4월 130 170 134 170

    일부만 공통된 값을 갖는 경우
    DataFrame_left_data.merge(DataFrame_right_data, how = merge_method, on = key_label
    on = 통합할 인자 입력(입력하지 않으면 공통된 열 자동설정)
    how = 지정된 열(key)을 기준으로 통합 방법(merge_method) 지정

    df_left = pd.DataFrame({'key':['A','B','C'],'left':[1,2,3]})
    df_left
      key left
    0 A 1
    1 B 2
    2 C 3
    df_right = pd.DataFrame({'key':['A','B','D'], 'right':[4,5,6]})
    df_right
      key right
    0 A 4
    1 B 5
    2 D 6
    df_left.merge(df_right, how='left', on='key') # df_left 기준
      key left right
    0 A 1 4.0
    1 B 2 5.0
    2 C 3 NaN
    df_left.merge(df_right, how='right', on = 'key') #dt_right 기준
      key left right
    0 A 1.0 4
    1 B 2.0 5
    2 D NaN 6
    df_left.merge(df_right, how='outer', on = 'key') # 결측치 있든 없든 모두
      key left right
    0 A 1.0 4.0
    1 B 2.0 5.0
    2 C 3.0 NaN
    3 D NaN 6.0
    df_left.merge(df_right, how='inner', on = 'key') # 둘 다 포함하는 키의 값들만
      key left right
    0 A 1 4
    1 B 2 5

     

    5. 데이터 파일을 읽고 쓰기

    표 형식의 데이터 파일을 읽기

    DataFrame_data = pd.read_csv(file_name [,option])

    %%writefile C:\myPyCode\data\sea_rain1.csv
    연도,동해,남해,서해,전체
    1996,17.4629,17.2288,14.436,15.9067
    1997,17.4116,17.4092,14.8248,16.1526
    1998,17.5944,18.011,15.2512,16.6044
    1999,18.1495,18.3175,14.8979,16.6284
    2000,17.9288,18.1766,15.0504,16.6178
    >>> Overwriting C:\myPyCode\data\sea_rain1.csv
    pd.read_csv('C:/myPyCode/data/sea_rain1.csv')
      연도 동해 남해 서해 전체
    0 1996 17.4629 17.2288 14.4360 15.9067
    1 1997 17.4116 17.4092 14.8248 16.1526
    2 1998 17.5944 18.0110 15.2512 16.6044
    3 1999 18.1495 18.3175 14.8979 16.6284
    4 2000 17.9288 18.1766 15.0504 16.6178
    pd.read_csv('C:/myPyCode/data/sea_rain1_from_notepad.csv', encoding = "cp949")
      연도 동해 남해 서해 전체
    0 1996 17.4629 17.2288 14.4360 15.9067
    1 1997 17.4116 17.4092 14.8248 16.1526
    2 1998 17.5944 18.0110 15.2512 16.6044
    3 1999 18.1495 18.3175 14.8979 16.6284
    4 2000 17.9288 18.1766 15.0504 16.6178

    필드를 공백으로 저장하기

    %%writefile C://myPyCode//data//sea_rain1_space.txt
    연도 동해 남해 서해 전체
    1996 17.4629 17.2288 14.436 15.9067
    1997 17.4116 17.4092 14.8248 16.1526
    1998 17.5944 18.011 15.2512 16.6044
    1999 18.1495 18.3175 14.8979 16.6284
    2000 17.9288 18.1766 15.0504 16.6178
    >>> Writing C://myPyCode//data//sea_rain1_space.txt
    pd.read_csv('C:/myPyCode/data/sea_rain1_space.txt', sep=" ")
      연도 동해 남해 서해 전체
    0 1996 17.4629 17.2288 14.4360 15.9067
    1 1997 17.4116 17.4092 14.8248 16.1526
    2 1998 17.5944 18.0110 15.2512 16.6044
    3 1999 18.1495 18.3175 14.8979 16.6284
    4 2000 17.9288 18.1766 15.0504 16.6178
    sea_rain = pd.read_csv('C:/myPyCode/data/sea_rain1.csv')
    sea_rain.columns
    >>> Index(['연도', '동해', '남해', '서해', '전체'], dtype='object')
    pd.read_csv('C:/myPyCode/data/sea_rain1.csv', index_col="연도")
      동해 남해 서해 전체
    연도        
    1996 17.4629 17.2288 14.4360 15.9067
    1997 17.4116 17.4092 14.8248 16.1526
    1998 17.5944 18.0110 15.2512 16.6044
    1999 18.1495 18.3175 14.8979 16.6284
    2000 17.9288 18.1766 15.0504 16.6178

    표 형식의 데이터를 파일로 쓰기

    df_WH = pd.DataFrame({'Weight':[62,67,55,74],
                         'Height':[165,177,160,180]},
                         index = ['ID_1','ID_2','ID_3','ID-4'])
    df_WH.index.name = 'User'
    df_WH
      Weight Height
    User    
    ID_1 62 165
    ID_2 67 177
    ID_3 55 160
    ID-4 74 180

    체질량 지수 구하기

    bmi = df_WH['Weight']/(df_WH['Height']/100)**2
    bmi
    >>> 
    User
    ID_1    22.773186
    ID_2    21.385936
    ID_3    21.484375
    ID-4    22.839506
    dtype: float64

    새로운 열 추가
    df['columns_name'] = column_data

    df_WH['BMI'] = bmi
    df_WH
      Weight Height BMI
    User      
    ID_1 62 165 22.773186
    ID_2 67 177 21.385936
    ID_3 55 160 21.484375
    ID-4 74 180 22.839506
    df_WH.to_csv('C:/myPyCode/data/save_DataFrame.csv')

    저장된 파일 불러오기

    !type C:\myPyCode\data\save_DataFrame.csv
    >>> 
    User,Weight,Height,BMI
    ID_1,62,165,22.77318640955005
    ID_2,67,177,21.38593635289987
    ID_3,55,160,21.484374999999996
    ID-4,74,180,22.839506172839506
    df_pr = pd.DataFrame({'판매가격':[2000, 3000, 5000, 10000],
                           '판매량':[32, 53, 40, 25]},
                           index=['P1001', 'P1002', 'P1003', 'P1004'])
    df_pr.index.name = '제품번호'
    df_pr
      판매가격 판매량
    제품번호    
    P1001 2000 32
    P1002 3000 53
    P1003 5000 40
    P1004 10000 25
    file_name = 'C:/myPyCode/data/save_DataFrame_cp949.txt'
    df_pr.to_csv(file_name, sep=" ", encoding = "cp949")
    !type C:\myPyCode\data\save_DataFrame_cp949.txt
    >>> 
    제품번호 판매가격 판매량
    P1001 2000 32
    P1002 3000 53
    P1003 5000 40
    P1004 10000 25

    댓글

Designed by Tistory.