본문 바로가기

공부기록/Python

jupyter notebook 코드 티스토리에 업로드하기

1장 Pandas 기초 익히기

Pandas 기초 익히기 from 파이썬으로 데이터 주무르기

JupyterNotebook - [File] - [Print Preview] - Ctrl+U - 소스코드 복사

티스토리에서 HTML 모드로 삽입.

HTML 코드를 그대로 삽입하고 나면, 화면의 전체적인 글씨가 한번에 작아진다.

html {
  font-size: 10px;
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
body {
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 13px;
  line-height: 1.42857143;
  color: #000;
  background-color: #fff;
}

이 부분을 지우고 복사하면 괜찮아진다.

pandas 기초 익히기

In [1]:
import pandas as pd
import numpy as np

series : pandas의 데이터 유형 중 기초가 되는 데이터 유형

In [2]:
s = pd.Series([1,3,5,np.nan,6,8])
s
Out[2]:
0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64

date_range 날짜형 데이터

In [3]:
dates = pd.date_range('20130101', periods=6)
dates
Out[3]:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'],
              dtype='datetime64[ns]', freq='D')

DataFrame 또한 데이터 유형의 하나.
6행 4열의 random 변수를 만들고, column은 A, B, C, D 로, index는 위에서 만든 dates로 지정

In [4]:
df = pd.DataFrame(np.random.randn(6,4), index =dates, columns=['A', 'B', 'C', 'D'])
df
Out[4]:
A B C D
2013-01-01 -0.840513 -0.226831 -0.299014 0.656726
2013-01-02 0.122427 -1.318289 -1.329819 0.098809
2013-01-03 -0.675058 -0.627330 0.293554 0.810983
2013-01-04 1.015026 1.398037 -0.592219 0.313311
2013-01-05 0.256272 -0.523378 0.524817 0.532783
2013-01-06 0.448039 0.686675 1.358189 -0.514602

df DataFrame 확인. 너무 길면 jupyter notebook이 내용을 줄여서 보여준다.
df.index DataFrame의 index 확인
df.columns DataFrame의 column 확인
df.values 값 확인
df.info() DataFrame의 개요 확인
df.decribe() 통계적개요 확인. 개수, 평균, 표준편차, 최대/최소 등

In [5]:
df.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 6 entries, 2013-01-01 to 2013-01-06
Freq: D
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   A       6 non-null      float64
 1   B       6 non-null      float64
 2   C       6 non-null      float64
 3   D       6 non-null      float64
dtypes: float64(4)
memory usage: 240.0 bytes
In [6]:
df.describe()
Out[6]:
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean 0.054365 -0.101853 -0.007415 0.316335
std 0.700873 0.981896 0.939628 0.478576
min -0.840513 -1.318289 -1.329819 -0.514602
25% -0.475687 -0.601342 -0.518918 0.152435
50% 0.189350 -0.375104 -0.002730 0.423047
75% 0.400098 0.458299 0.467001 0.625740
max 1.015026 1.398037 1.358189 0.810983

df.sort_values(by= 정렬기준컬럼, ascending = 오름차순여부 )

In [8]:
df.sort_values(by = 'B', ascending = False)
Out[8]:
A B C D
2013-01-04 1.015026 1.398037 -0.592219 0.313311
2013-01-06 0.448039 0.686675 1.358189 -0.514602
2013-01-01 -0.840513 -0.226831 -0.299014 0.656726
2013-01-05 0.256272 -0.523378 0.524817 0.532783
2013-01-03 -0.675058 -0.627330 0.293554 0.810983
2013-01-02 0.122427 -1.318289 -1.329819 0.098809
In [9]:
df['A']
Out[9]:
2013-01-01   -0.840513
2013-01-02    0.122427
2013-01-03   -0.675058
2013-01-04    1.015026
2013-01-05    0.256272
2013-01-06    0.448039
Freq: D, Name: A, dtype: float64

A 컬럼만 Series 형태로 보여준다

df.loc[행범위,열범위] 인덱스를 통해 데이터 추출

In [11]:
df.loc[dates[0]]
Out[11]:
A   -0.840513
B   -0.226831
C   -0.299014
D    0.656726
Name: 2013-01-01 00:00:00, dtype: float64
In [13]:
df.loc[:,['A','B']]
Out[13]:
A B
2013-01-01 -0.840513 -0.226831
2013-01-02 0.122427 -1.318289
2013-01-03 -0.675058 -0.627330
2013-01-04 1.015026 1.398037
2013-01-05 0.256272 -0.523378
2013-01-06 0.448039 0.686675
In [15]:
df.loc['20130102':'20130104',['A','B']]
Out[15]:
A B
2013-01-02 0.122427 -1.318289
2013-01-03 -0.675058 -0.627330
2013-01-04 1.015026 1.398037

20130102부터 20130104까지의 데이터를 A, B 열만 가져온다

df.iloc[] 행번호, 열번호를 이용해 데이터에 바로 접근. (그냥 : 만 쓰면 전체범위를 의미)

In [16]:
df.iloc[3]
Out[16]:
A    1.015026
B    1.398037
C   -0.592219
D    0.313311
Name: 2013-01-04 00:00:00, dtype: float64

숫자 하나일 땐 행번호 의미

In [17]:
df.iloc[3:5, 0:2]
Out[17]:
A B
2013-01-04 1.015026 1.398037
2013-01-05 0.256272 -0.523378
In [20]:
df.iloc[[1,2,4],0:2]
Out[20]:
A B
2013-01-02 0.122427 -1.318289
2013-01-03 -0.675058 -0.627330
2013-01-05 0.256272 -0.523378

조건을 만족하는 데이터만 가져오기

In [22]:
# A 컬럼이 0 보다 큰 데이터만 가져오기
df[df.A > 0]
Out[22]:
A B C D
2013-01-02 0.122427 -1.318289 -1.329819 0.098809
2013-01-04 1.015026 1.398037 -0.592219 0.313311
2013-01-05 0.256272 -0.523378 0.524817 0.532783
2013-01-06 0.448039 0.686675 1.358189 -0.514602
In [23]:
df[df > 0]
Out[23]:
A B C D
2013-01-01 NaN NaN NaN 0.656726
2013-01-02 0.122427 NaN NaN 0.098809
2013-01-03 NaN NaN 0.293554 0.810983
2013-01-04 1.015026 1.398037 NaN 0.313311
2013-01-05 0.256272 NaN 0.524817 0.532783
2013-01-06 0.448039 0.686675 1.358189 NaN

DataFrame 복사하기

In [27]:
df2 = df.copy()
df2
Out[27]:
A B C D
2013-01-01 -0.840513 -0.226831 -0.299014 0.656726
2013-01-02 0.122427 -1.318289 -1.329819 0.098809
2013-01-03 -0.675058 -0.627330 0.293554 0.810983
2013-01-04 1.015026 1.398037 -0.592219 0.313311
2013-01-05 0.256272 -0.523378 0.524817 0.532783
2013-01-06 0.448039 0.686675 1.358189 -0.514602

새로운 컬럼 추가

In [31]:
df2['E'] = ['one', 'two', 'three', 'four', 'five', 'six']
df2
Out[31]:
A B C D E
2013-01-01 -0.840513 -0.226831 -0.299014 0.656726 one
2013-01-02 0.122427 -1.318289 -1.329819 0.098809 two
2013-01-03 -0.675058 -0.627330 0.293554 0.810983 three
2013-01-04 1.015026 1.398037 -0.592219 0.313311 four
2013-01-05 0.256272 -0.523378 0.524817 0.532783 five
2013-01-06 0.448039 0.686675 1.358189 -0.514602 six
In [34]:
# E 컬럼에 'two','four'가 있는지 조건을 걸어 검사
df2[df2['E'].isin(['two', 'four'])]
Out[34]:
A B C D E
2013-01-02 0.122427 -1.318289 -1.329819 0.098809 two
2013-01-04 1.015026 1.398037 -0.592219 0.313311 four
In [35]:
# DataFrame에 함수 적용하기 .apply()
# Numpy 의 cumsum 함수 : 누적합계산
df.apply(np.cumsum)
Out[35]:
A B C D
2013-01-01 -0.840513 -0.226831 -0.299014 0.656726
2013-01-02 -0.718086 -1.545120 -1.628833 0.755535
2013-01-03 -1.393144 -2.172451 -1.335279 1.566518
2013-01-04 -0.378119 -0.774413 -1.927498 1.879829
2013-01-05 -0.121846 -1.297791 -1.402681 2.412613
2013-01-06 0.326193 -0.611115 -0.044492 1.898010
In [36]:
# 최대값과 최소값의 차이
df.apply(lambda x: x.max() - x.min())
Out[36]:
A    1.855538
B    2.716327
C    2.688009
D    1.325586
dtype: float64
In [1]:
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:100% !important;}</style>"))