In [62]:
import numpy as np
import pandas as pd
import seaborn as sns
print(np.__version__)
print(pd.__version__)
print(sns.__version__)
1.26.3
2.1.4
0.13.1
데이터프레임을 이용한 데이터 생성¶
In [63]:
#다차원 데이터 만들기
table_data = {
'연도' : [2015, 2016, 2016, 2017, 2017],
'지사' : ['한국', '한국', '미국', '한국', '미국'],
'고객수' : [200, 250, 450, 300, 500]
}
table_data
Out[63]:
{'연도': [2015, 2016, 2016, 2017, 2017],
'지사': ['한국', '한국', '미국', '한국', '미국'],
'고객수': [200, 250, 450, 300, 500]}
In [64]:
# 데이터프레임화
df = pd.DataFrame(table_data)
df
Out[64]:
연도 | 지사 | 고객수 | |
---|---|---|---|
0 | 2015 | 한국 | 200 |
1 | 2016 | 한국 | 250 |
2 | 2016 | 미국 | 450 |
3 | 2017 | 한국 | 300 |
4 | 2017 | 미국 | 500 |
In [65]:
print(df.index)
print(df.values.shape) #열이 5, 행이 3
print(df.columns)
RangeIndex(start=0, stop=5, step=1)
(5, 3)
Index(['연도', '지사', '고객수'], dtype='object')
Series와 DataFrame의 연산¶
In [66]:
s1 = pd.Series([1, 2, 3, 4, 5])
s2 = pd.Series([10, 20, 30, 40, 50])
print(s1)
print(s2)
0 1
1 2
2 3
3 4
4 5
dtype: int64
0 10
1 20
2 30
3 40
4 50
dtype: int64
In [67]:
print(s1 + s2)
print(s1 - s2)
print(s1 * s2)
print(s1 / s2)
0 11
1 22
2 33
3 44
4 55
dtype: int64
0 -9
1 -18
2 -27
3 -36
4 -45
dtype: int64
0 10
1 40
2 90
3 160
4 250
dtype: int64
0 0.1
1 0.1
2 0.1
3 0.1
4 0.1
dtype: float64
In [68]:
#list와 numpy와는 다르게 두 배열의 크기가 달라도 연산이 가능함.
s1 = pd.Series([1, 2, 3, 4, 5])
s2 = pd.Series([10, 20, 30, 40, 50, 60])
s1 + s2 #50이 있는 인덱스는 NaN, 결측치로 처리함.
Out[68]:
0 11.0
1 22.0
2 33.0
3 44.0
4 55.0
5 NaN
dtype: float64
In [69]:
table_data1 = {'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50],
'C': [100, 200, 300, 400, 500],
'D': [1, 2, 3, 4, 5]}
df1 = pd.DataFrame(table_data1)
table_data2 = {'A': [6, 7, 8],
'B': [60, 70, 80],
'C': [600, 700, 800]}
df2 = pd.DataFrame(table_data2)
In [70]:
#Series의 연산과 같다.
#연산을 할 대상이 없으면 NaN으로 처리한다.
df1 + df2
Out[70]:
A | B | C | D | |
---|---|---|---|---|
0 | 7.0 | 70.0 | 700.0 | NaN |
1 | 9.0 | 90.0 | 900.0 | NaN |
2 | 11.0 | 110.0 | 1100.0 | NaN |
3 | NaN | NaN | NaN | NaN |
4 | NaN | NaN | NaN | NaN |
In [71]:
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]
}
index_list = ['2012', '2013', '2014', '2015', '2016'] # 0~4인 인덱스를 바꿈.
df3 = pd.DataFrame(table_data3, index = index_list)
df3
Out[71]:
봄 | 여름 | 가을 | 겨울 | |
---|---|---|---|---|
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 |
In [72]:
print(df3.max())
print("-" * 15)
print(df3.min())
print("-" * 15)
print(df3.mean()) #1행에 대한 평균
print("-" * 15)
print(df3.std()) #1행에 대한 표준편차
봄 312.8
여름 770.6
가을 381.6
겨울 139.3
dtype: float64
---------------
봄 215.9
여름 387.1
가을 231.2
겨울 59.9
dtype: float64
---------------
봄 254.54
여름 554.24
가을 303.42
겨울 98.66
dtype: float64
---------------
봄 38.628267
여름 148.888895
가을 67.358496
겨울 30.925523
dtype: float64
In [73]:
print(df3.mean(axis = 1)) #1열에 대한 평균
print("-" * 15)
print(df3.std(axis = 1)) #1열에 대한 표준편차
2012 382.475
2013 280.725
2014 296.425
2015 241.775
2016 312.175
dtype: float64
---------------
2012 274.472128
2013 211.128782
2014 221.150739
2015 114.166760
2016 146.548658
dtype: float64
- 해석하기
- 가장 강수량의 평균이 낮은 연도: 2015년
- 표준편차의 의미: 평균에 대한 오차, 산포도가 앞뒤로 114만큼 있다. (범위가 127 ~ 355)
- 가장 강수량의 평균이 높은 연도: 2012년
- 산포도가 앞뒤로 271만큼 있다.
- 2015년에는 상대적으로 강수량이 많은 날과 적은 날의 편차가 작은 대신 평균적으로 적게 내렸으며 2012년에는 편차가 큰 대신 평균적으로 많이 내렸다.
In [74]:
df3.describe() #describe(axis=1)이 없으니 수동으로 처리해야 함.
Out[74]:
봄 | 여름 | 가을 | 겨울 | |
---|---|---|---|---|
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 |
In [75]:
df3.transpose()
Out[75]:
2012 | 2013 | 2014 | 2015 | 2016 | |
---|---|---|---|---|---|
봄 | 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 |
In [76]:
df3.transpose().describe()
Out[76]:
2012 | 2013 | 2014 | 2015 | 2016 | |
---|---|---|---|---|---|
count | 4.000000 | 4.000000 | 4.000000 | 4.00000 | 4.000000 |
mean | 382.475000 | 280.725000 | 296.425000 | 241.77500 | 312.175000 |
std | 274.472128 | 211.128782 | 221.150739 | 114.16676 | 146.548658 |
min | 139.300000 | 59.900000 | 76.900000 | 109.10000 | 108.100000 |
25% | 227.200000 | 188.375000 | 181.150000 | 194.67500 | 261.625000 |
50% | 310.000000 | 247.750000 | 254.500000 | 235.45000 | 347.200000 |
75% | 465.275000 | 340.100000 | 369.775000 | 282.55000 | 397.750000 |
max | 770.600000 | 567.500000 | 599.800000 | 387.10000 | 446.200000 |
In [77]:
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]}
index_list = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
df_KTX = pd.DataFrame(KTX_data, index = index_list)
df_KTX
Out[77]:
경부선 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 |
In [78]:
df_KTX.head(2) #첫 n개의 행 반환. 디폴트는 5개
Out[78]:
경부선 KTX | 호남선 KTX | 경전선 KTX | 전라선 KTX | 동해선 KTX | |
---|---|---|---|---|---|
2011 | 39060 | 7313 | 3627 | 309 | NaN |
2012 | 39896 | 6967 | 4168 | 1771 | NaN |
In [79]:
df_KTX.tail(2) #마지막 n개의 행 반환
Out[79]:
경부선 KTX | 호남선 KTX | 경전선 KTX | 전라선 KTX | 동해선 KTX | |
---|---|---|---|---|---|
2016 | 41266 | 10622 | 4984 | 3945 | 3786.0 |
2017 | 32427 | 9228 | 5570 | 5766 | 6667.0 |
In [80]:
df_KTX[2:5] #인덱스 2번째부터 4번째까지 추출(3번째 행부터 5번째 행)
Out[80]:
경부선 KTX | 호남선 KTX | 경전선 KTX | 전라선 KTX | 동해선 KTX | |
---|---|---|---|---|---|
2013 | 42005 | 6873 | 4088 | 1954 | NaN |
2014 | 43621 | 6626 | 4424 | 2244 | NaN |
2015 | 41702 | 8675 | 4606 | 3146 | 2395.0 |
'IT학습 > Library' 카테고리의 다른 글
[pandas] csv파일 입출력, 데이터값 수정, concat/merge (0) | 2024.01.17 |
---|---|
[pandas] loc 기본, 기술통계량 (0) | 2024.01.17 |
[pandas] Series 데이터 구조, 날짜 데이터 (0) | 2024.01.12 |
[numpy] 배열의 조건문, numpy 조건문 (0) | 2024.01.08 |
[numpy] 배열의 인덱싱, 슬라이싱 (0) | 2024.01.08 |