-
[PlayData - Day 10] Pandas - 구조적 데이터 표시와 처리[플레이데이터] 2023. 1. 6. 10:26
1. K-Digital Training 과정
- 빅데이터 기반 지능형SW 및 MLOps 개발자 양성과정 19기 (2023/01/03 - Day 10)
2. 목차
- 구조적 데이터 생성하기
- 데이터 연산
- 데이터를 원하는 대로 선택하기
- 데이터 통합하기
- 데이터 파일을 읽고 쓰기
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_datadf_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
'[플레이데이터]' 카테고리의 다른 글
[PlayData - Day 12] 파이썬으로 엑셀 파일 다루기 (0) 2023.01.06 [PlayData - Day 11] Matplotlib - 데이터 시각화 (1) 2023.01.06 [PlayData - Day 9] Numpy - 배열 데이터 다루기 (1) 2023.01.06 [PlayData - Day 8] 모듈 (0) 2022.12.29 [PlayData - Day 7] 문자열과 텍스트 파일 데이터 다루기 (0) 2022.12.28