반응형

<참조> pandas.pydata.org/docs/user_guide/10min.html

판다스 퀵 가이드

 

정리. 수알치 오상문

 

판다스, 넘파일 모듈 임포트

In [2]:

import numpy as np

import pandas as pd

 

객체 생성

 

Series에 전달된 리스트에 정수 인덱스를 추가한 씨리즈 객체 생성

In [3]:

s = pd.Series([1, 3, 5, np.nan, 6, 8]) # 리스트를 이용한 시리즈 생성

s

Out[3]:

0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64

 

날짜시간 인덱스 만들기, 넘파이 배열

In [4]:

dates = pd.date_range("20130101", periods=6) # freq='D' 날짜 단위:

                                                  # periods=6 시작 날짜 인덱스부터 6개

dates

Out[4]:

DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'], dtype='datetime64[ns]', freq='D')

In [5]:

dates = pd.date_range("20130101", periods=6, freq='M') # 시작일 인덱스부터 1개월 단위로 6개월 말일

dates

Out[5]:

DatetimeIndex(['2013-01-31', '2013-02-28', '2013-03-31', '2013-04-30', '2013-05-31', '2013-06-30'], dtype='datetime64[ns]', freq='M')

 

날짜 리스트를 인덱스로 이용하는 데이터프레임 생성

In [19]:

df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list("ABCD")) #['A','B','C','D']

df

Out[19]:

ABCD2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

-1.055769 0.123548 1.149740 -0.579865
-0.591614 -0.702674 -1.429883 -0.209130
0.357885 -1.929328 -0.333277 1.171030
0.529684 1.134368 0.532032 0.673225
0.584617 0.342729 -2.015060 -2.204650
0.622734 -0.225322 0.239147 0.189629

In [9]:

pd.Categorical(["test", "train", "test", "train"]) # 두 객체로 구분되는 카테고리 객체 생성

Out[9]:

['test', 'train', 'test', 'train'] Categories (2, object): ['test', 'train']

In [10]:

df2 = pd.DataFrame( { "A": 1.0, # 나머지는 같은 값

"B": pd.Timestamp("20130102"), # 시간 스템프 설정

"C": pd.Series(1, index=list(range(4)), dtype="float32"), # 인덱스는 가장 앞에 표시됨

"D": np.array([3]*4, dtype="int32"),

"E": pd.Categorical(["test", "train", "test", "train"]),

"F": "foo", # 나머지는 같은 값 } )

df2

Out[10]:

ABCDEF0123

1.0 2013-01-02 1.0 3 test foo
1.0 2013-01-02 1.0 3 train foo
1.0 2013-01-02 1.0 3 test foo
1.0 2013-01-02 1.0 3 train foo

In [11]:

df2.dtypes

Out[11]:

A float64 B datetime64[ns] C float32 D int32 E category F object dtype: object

In [17]:

df2 # . 찍고 Tab 눌러서 하위 기능 찾기

Out[17]:

ABCDEF0123

1.0 2013-01-02 1.0 3 test foo
1.0 2013-01-02 1.0 3 train foo
1.0 2013-01-02 1.0 3 test foo
1.0 2013-01-02 1.0 3 train foo

 

데이터 살펴보기

In [20]:

df.head()   # 선두 다섯 줄 출력 (숫자 옵션 가능)

Out[20]:

ABCD2013-01-312013-02-282013-03-312013-04-302013-05-31

-1.055769 0.123548 1.149740 -0.579865
-0.591614 -0.702674 -1.429883 -0.209130
0.357885 -1.929328 -0.333277 1.171030
0.529684 1.134368 0.532032 0.673225
0.584617 0.342729 -2.015060 -2.204650

In [21]:

df.tail(3) # 하위 세 줄 출력

Out[21]:

ABCD2013-04-302013-05-312013-06-30

0.529684 1.134368 0.532032 0.673225
0.584617 0.342729 -2.015060 -2.204650
0.622734 -0.225322 0.239147 0.189629

In [22]:

df.index # 데이터프레임의 인덱스 리스트

Out[22]:

DatetimeIndex(['2013-01-31', '2013-02-28', '2013-03-31', '2013-04-30', '2013-05-31', '2013-06-30'], dtype='datetime64[ns]', freq='M')

In [23]:

df.columns # 데이터프레임의 컬럼명 리스트

Out[23]:

Index(['A', 'B', 'C', 'D'], dtype='object')

In [24]:

df.to_numpy() # 넘파이 배열로 변경 (인덱스와 컬럼명 사라짐)

Out[24]:

array([[-1.05576939, 0.12354823, 1.14974044, -0.57986524], [-0.59161445, -0.70267413, -1.42988296, -0.20913039], [ 0.35788529, -1.92932839, -0.33327708, 1.17103026], [ 0.52968399, 1.13436828, 0.53203228, 0.67322523], [ 0.5846174 , 0.34272887, -2.01506048, -2.20465016], [ 0.62273402, -0.2253223 , 0.23914683, 0.18962854]])

In [25]:

df2.to_numpy()

Out[25]:

array([[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'], [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo'], [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'], [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo']], dtype=object)

In [30]:

df.describe() # 통계값

Out[30]:

ABCDcountmeanstdmin25%50%75%max

6.000000 6.000000 6.000000 6.000000
0.074589 -0.209447 -0.309550 -0.159960
0.716868 1.041455 1.208580 1.178766
-1.055769 -1.929328 -2.015060 -2.204650
-0.354240 -0.583336 -1.155731 -0.487182
0.443785 -0.050887 -0.047065 -0.009751
0.570884 0.287934 0.458811 0.552326
0.622734 1.134368 1.149740 1.171030

In [32]:

ds = df.describe()

ds.iloc[0,0] # 6.0

ds.iloc[0] # 첫줄(count)

Out[32]:

A 6.0 B 6.0 C 6.0 D 6.0 Name: count, dtype: float64

In [35]:

ds.iloc[1,0:3] # 두번째 줄 mean에서 앞 세개

Out[35]:

A 0.074589 B -0.209447 C -0.309550 Name: mean, dtype: float64

In [67]:

ds.at["std", "A"] # ds.loc["std", "A"]

Out[67]:

0.716867812480241

In [37]:

df1 = df.describe()

df1.fillna(value=5) # NaN 값은 5로 대체

Out[37]:

ABCDcountmeanstdmin25%50%75%max

6.000000 6.000000 6.000000 6.000000
0.074589 -0.209447 -0.309550 -0.159960
0.716868 1.041455 1.208580 1.178766
-1.055769 -1.929328 -2.015060 -2.204650
-0.354240 -0.583336 -1.155731 -0.487182
0.443785 -0.050887 -0.047065 -0.009751
0.570884 0.287934 0.458811 0.552326
0.622734 1.134368 1.149740 1.171030

In [38]:

df.T # 가로세로 바꿈

Out[38]:

2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30ABCD

-1.055769 -0.591614 0.357885 0.529684 0.584617 0.622734
0.123548 -0.702674 -1.929328 1.134368 0.342729 -0.225322
1.149740 -1.429883 -0.333277 0.532032 -2.015060 0.239147
-0.579865 -0.209130 1.171030 0.673225 -2.204650 0.189629

In [40]:

df.sort_index(axis=1, ascending=False) # 컴럼명 정렬(내림차순)

Out[40]:

DCBA2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

-0.579865 1.149740 0.123548 -1.055769
-0.209130 -1.429883 -0.702674 -0.591614
1.171030 -0.333277 -1.929328 0.357885
0.673225 0.532032 1.134368 0.529684
-2.204650 -2.015060 0.342729 0.584617
0.189629 0.239147 -0.225322 0.622734

In [41]:

df.sort_values(by="B") # B 컬럼 값 기준으로 오름차순 정렬

Out[41]:

ABCD2013-03-312013-02-282013-06-302013-01-312013-05-312013-04-30

0.357885 -1.929328 -0.333277 1.171030
-0.591614 -0.702674 -1.429883 -0.209130
0.622734 -0.225322 0.239147 0.189629
-1.055769 0.123548 1.149740 -0.579865
0.584617 0.342729 -2.015060 -2.204650
0.529684 1.134368 0.532032 0.673225

 

선택

In [42]:

df["A"] # df.A A 컬럼과 인덱스 출력

Out[42]:

2013-01-31 -1.055769 2013-02-28 -0.591614 2013-03-31 0.357885 2013-04-30 0.529684 2013-05-31 0.584617 2013-06-30 0.622734 Freq: M, Name: A, dtype: float64

In [43]:

df[0:3] # 0줄부터 2번 줄까지

Out[43]:

ABCD2013-01-312013-02-282013-03-31

-1.055769 0.123548 1.149740 -0.579865
-0.591614 -0.702674 -1.429883 -0.209130
0.357885 -1.929328 -0.333277 1.171030

In [49]:

df["20130101":"20130131"] # 줄 인덱스 날짜 기준 범위 지정 (2013년 1월)

Out[49]:

ABCD2013-01-31

-1.055769 0.123548 1.14974 -0.579865

 

레이블을 이용한 선택

In [51]:

df.loc[dates[0]] # 레이블의 줄 기준 (2013-01-31) 인덱스 줄 내용

Out[51]:

A -1.055769 B 0.123548 C 1.149740 D -0.579865 Name: 2013-01-31 00:00:00, dtype: float64

In [69]:

df.loc[:, ["A", "B"]]

Out[69]:

AB2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

-1.055769 0.123548
-0.591614 -0.702674
0.357885 -1.929328
0.529684 1.134368
0.584617 0.342729
0.622734 -0.225322

In [68]:

df.loc["20130101":"20130131", ["A", "B"]]

Out[68]:

AB2013-01-31

-1.055769 0.123548

In [60]:

df.loc["20130131", ["A", "B"]]

Out[60]:

A -1.055769 B 0.123548 Name: 2013-01-31 00:00:00, dtype: float64

In [70]:

df.loc[dates[0], "A"]

Out[70]:

-1.0557693910070804

In [71]:

df.at[dates[0], "A"] # 앞과 동일

Out[71]:

-1.0557693910070804

 

위치를 이용한 선택

In [72]:

df.iloc[3]

Out[72]:

A 0.529684 B 1.134368 C 0.532032 D 0.673225 Name: 2013-04-30 00:00:00, dtype: float64

In [73]:

df.iloc[3:5, 0:2]

Out[73]:

AB2013-04-302013-05-31

0.529684 1.134368
0.584617 0.342729

In [74]:

df.iloc[[1, 2, 4], [0, 2]]

Out[74]:

AC2013-02-282013-03-312013-05-31

-0.591614 -1.429883
0.357885 -0.333277
0.584617 -2.015060

In [75]:

df.iloc[1:3, :]

Out[75]:

ABCD2013-02-282013-03-31

-0.591614 -0.702674 -1.429883 -0.20913
0.357885 -1.929328 -0.333277 1.17103

In [76]:

df.iloc[:, 1:3]

Out[76]:

BC2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

0.123548 1.149740
-0.702674 -1.429883
-1.929328 -0.333277
1.134368 0.532032
0.342729 -2.015060
-0.225322 0.239147

In [77]:

df.iloc[1, 1]

Out[77]:

-0.7026741300519964

 

논리 인덱싱

In [79]:

df[df["A"] > 0] # "A" 값이 0보다 큰 경우

Out[79]:

ABCD2013-03-312013-04-302013-05-312013-06-30

0.357885 -1.929328 -0.333277 1.171030
0.529684 1.134368 0.532032 0.673225
0.584617 0.342729 -2.015060 -2.204650
0.622734 -0.225322 0.239147 0.189629

In [81]:

df[df > 0] # df에서 값이 0 이상인 경우, NaN 포함됨

Out[81]:

ABCD2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

NaN 0.123548 1.149740 NaN
NaN NaN NaN NaN
0.357885 NaN NaN 1.171030
0.529684 1.134368 0.532032 0.673225
0.584617 0.342729 NaN NaN
0.622734 NaN 0.239147 0.189629

In [83]:

df2 = df.copy() # 데이터프레임 복사

df2["E"] = ["one", "one", "two", "three", "four", "three"] # 데이터프레임 컬럼 추가

df2

Out[83]:

ABCDE2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

-1.055769 0.123548 1.149740 -0.579865 one
-0.591614 -0.702674 -1.429883 -0.209130 one
0.357885 -1.929328 -0.333277 1.171030 two
0.529684 1.134368 0.532032 0.673225 three
0.584617 0.342729 -2.015060 -2.204650 four
0.622734 -0.225322 0.239147 0.189629 three

In [84]:

df2[df2["E"].isin(["two", "four"])] # E 컬럼에서 값이 'two' 또는 'four'인 경우만

Out[84]:

ABCDE2013-03-312013-05-31

0.357885 -1.929328 -0.333277 1.17103 two
0.584617 0.342729 -2.015060 -2.20465 four

 

값 설정

In [86]:

s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range("20130102", periods=6))

s1 # 20130102~20130107을 인덱스로 사용

Out[86]:

2013-01-02 1 2013-01-03 2 2013-01-04 3 2013-01-05 4 2013-01-06 5 2013-01-07 6 Freq: D, dtype: int64

In [87]:

df["F"] = s1 # 데이터프레임에 F 컬럼 추가

df

Out[87]:

ABCDF2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

-1.055769 0.123548 1.149740 -0.579865 NaN
-0.591614 -0.702674 -1.429883 -0.209130 NaN
0.357885 -1.929328 -0.333277 1.171030 NaN
0.529684 1.134368 0.532032 0.673225 NaN
0.584617 0.342729 -2.015060 -2.204650 NaN
0.622734 -0.225322 0.239147 0.189629 NaN

In [88]:

df.at[dates[0], "A"] = 0 # 첫 줄 A 컬럼 값을 0으로 설정

df

Out[88]:

ABCDF2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

0.000000 0.123548 1.149740 -0.579865 NaN
-0.591614 -0.702674 -1.429883 -0.209130 NaN
0.357885 -1.929328 -0.333277 1.171030 NaN
0.529684 1.134368 0.532032 0.673225 NaN
0.584617 0.342729 -2.015060 -2.204650 NaN
0.622734 -0.225322 0.239147 0.189629 NaN

In [90]:

df.iat[0, 1] = 0 # 첫 줄 두 번째 칸을 0으로 설정

df

Out[90]:

ABCDF2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

0.000000 0.000000 1.149740 -0.579865 NaN
-0.591614 -0.702674 -1.429883 -0.209130 NaN
0.357885 -1.929328 -0.333277 1.171030 NaN
0.529684 1.134368 0.532032 0.673225 NaN
0.584617 0.342729 -2.015060 -2.204650 NaN
0.622734 -0.225322 0.239147 0.189629 NaN

In [91]:

df.loc[:, "D"] = np.array([5] * len(df)) # 모든 줄 D 컬럼 값을 넘파이 배열 값으로 설정

df # len(df) == 6 줄

Out[91]:

ABCDF2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

0.000000 0.000000 1.149740 5 NaN
-0.591614 -0.702674 -1.429883 5 NaN
0.357885 -1.929328 -0.333277 5 NaN
0.529684 1.134368 0.532032 5 NaN
0.584617 0.342729 -2.015060 5 NaN
0.622734 -0.225322 0.239147 5 NaN

In [16]:

df2 = df.copy() # 복사

df2[df2 > 0] = -df2 # df2에서 0보다 큰 값은 음수로 변경

df2

Out[16]:

ABCD2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

-0.344774 -1.376965 -0.228405 -1.863025
-0.352389 -1.923041 -1.399938 -0.004830
-0.089310 -1.784562 -0.675897 -0.420429
-2.667826 -0.108573 -0.065607 -1.597503
-1.857954 -0.390874 -0.883918 -0.695088
-0.212533 -3.150105 -0.019306 -1.099416

 

결측치(Missing data) 처리

In [18]:

df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ["E"]) df1.loc[dates[0]:dates[1], "E"] = 1 df1

Out[18]:

ABCDE2013-01-312013-02-282013-03-312013-04-30

0.344774 1.376965 -0.228405 1.863025 1.0
-0.352389 -1.923041 1.399938 0.004830 1.0
-0.089310 -1.784562 0.675897 -0.420429 NaN
-2.667826 -0.108573 0.065607 1.597503 NaN

In [19]:

df1.dropna(how="any")

Out[19]:

ABCDE2013-01-312013-02-28

0.344774 1.376965 -0.228405 1.863025 1.0
-0.352389 -1.923041 1.399938 0.004830 1.0

In [20]:

df1.fillna(value=5)

Out[20]:

ABCDE2013-01-312013-02-282013-03-312013-04-30

0.344774 1.376965 -0.228405 1.863025 1.0
-0.352389 -1.923041 1.399938 0.004830 1.0
-0.089310 -1.784562 0.675897 -0.420429 5.0
-2.667826 -0.108573 0.065607 1.597503 5.0

In [21]:

pd.isna(df1)

Out[21]:

ABCDE2013-01-312013-02-282013-03-312013-04-30

False False False False False
False False False False False
False False False False True
False False False False True

 

계산, 연산

 

통계

In [22]:

df.mean() # df.mean(0)

Out[22]:

A -0.186555 B -0.996699 C 0.174738 D 0.208404 dtype: float64

In [25]:

df.mean(1)

Out[25]:

2013-01-31 0.839090 2013-02-28 -0.217665 2013-03-31 -0.404601 2013-04-30 -0.278322 2013-05-31 -0.027982 2013-06-30 -1.110687 Freq: M, dtype: float64

In [26]:

s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2) # 오른쪽 쉬프트 (NaN 채움) s

Out[26]:

2013-01-31 NaN 2013-02-28 NaN 2013-03-31 1.0 2013-04-30 3.0 2013-05-31 5.0 2013-06-30 NaN Freq: M, dtype: float64

In [27]:

df.sub(s, axis="index")

Out[27]:

ABCD2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

NaN NaN NaN NaN
NaN NaN NaN NaN
-1.089310 -2.784562 -0.324103 -1.420429
-5.667826 -3.108573 -2.934393 -1.402497
-3.142046 -5.390874 -5.883918 -5.695088
NaN NaN NaN NaN

 

함수 기능 적용하기 (Apply)

In [28]:

df.apply(np.cumsum)

Out[28]:

ABCD2013-01-312013-02-282013-03-312013-04-302013-05-312013-06-30

0.344774 1.376965 -0.228405 1.863025
-0.007615 -0.546077 1.171533 1.867855
-0.096925 -2.330639 1.847431 1.447426
-2.764751 -2.439212 1.913038 3.044929
-0.906798 -2.830087 1.029120 2.349841
-1.119331 -5.980192 1.048427 1.250425

In [29]:

df.apply(lambda x: x.max() - x.min())

Out[29]:

A 4.525779 B 4.527070 C 2.283856 D 2.962441 dtype: float64

 

히스토그램

In [30]:

s = pd.Series(np.random.randint(0, 7, size=10))

s

Out[30]:

0 5 1 1 2 3 3 4 4 2 5 5 6 6 7 5 8 0 9 2 dtype: int32

In [31]:

s.value_counts()

Out[31]:

5 3 2 2 6 1 4 1 3 1 1 1 0 1 dtype: int64

 

문자열 메서드

In [32]:

s = pd.Series(["A", "B", "C", "Aaba", "Baca", np.nan, "CABA", "dog", "cat"])

s.str.lower()

Out[32]:

0 a 1 b 2 c 3 aaba 4 baca 5 NaN 6 caba 7 dog 8 cat dtype: object

 

결합

 

Concat

In [34]:

df = pd.DataFrame(np.random.randn(10, 4))

df

Out[34]:

01230123456789

0.910924 -0.842393 -0.597197 -0.397208
1.359339 0.123996 0.391948 -0.465599
0.144632 0.015999 0.616410 0.130696
-0.102006 1.085817 0.499313 0.044379
1.310293 -0.283439 0.581588 1.299898
0.227918 -0.271547 0.215356 -1.668305
0.408246 0.867392 0.759891 0.609965
0.306584 -0.171098 0.000930 -2.040161
1.996865 -1.742960 -0.517612 0.807572
-0.048087 -1.584180 -0.301265 -1.103323

In [35]:

pieces = [df[:3], df[3:7], df[7:]]

pd.concat(pieces)

Out[35]:

01230123456789

0.910924 -0.842393 -0.597197 -0.397208
1.359339 0.123996 0.391948 -0.465599
0.144632 0.015999 0.616410 0.130696
-0.102006 1.085817 0.499313 0.044379
1.310293 -0.283439 0.581588 1.299898
0.227918 -0.271547 0.215356 -1.668305
0.408246 0.867392 0.759891 0.609965
0.306584 -0.171098 0.000930 -2.040161
1.996865 -1.742960 -0.517612 0.807572
-0.048087 -1.584180 -0.301265 -1.103323

 

Join

In [36]:

left = pd.DataFrame({"key": ["foo", "foo"], "lval": [1, 2]})

right = pd.DataFrame({"key": ["foo", "foo"], "rval": [4, 5]})

left

Out[36]:

keylval01

foo 1
foo 2

In [37]:

right

Out[37]:

keyrval01

foo 4
foo 5

In [38]:

pd.merge(left, right, on="key")

Out[38]:

keylvalrval0123

foo 1 4
foo 1 5
foo 2 4
foo 2 5

In [39]:

left = pd.DataFrame({"key": ["foo", "bar"], "lval": [1, 2]})

right = pd.DataFrame({"key": ["foo", "bar"], "rval": [4, 5]})

left

Out[39]:

keylval01

foo 1
bar 2

In [40]:

right

Out[40]:

keyrval01

foo 4
bar 5

In [41]:

pd.merge(left, right, on="key")

Out[41]:

keylvalrval01

foo 1 4
bar 2 5

 

그룹으로 묶기

-분류별로 그룹핑 Splitting

the data into groups based on some criteria

-각 그룹에 독립적인 함수 Applying

a function to each group independently

-결과를 데이터 구조로 Combining

 

the results into a data structure

In [92]:

df = pd.DataFrame( { "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],

"B": ["one", "one", "two", "three", "two", "two", "one", "three"],

"C": np.random.randn(8),

"D": np.random.randn(8), } )

df

Out[92]:

ABCD01234567

foo one -1.683750 2.181957
bar one -0.245602 0.715753
foo two -0.771462 -1.275296
bar three 1.115769 -0.731296
foo two -1.334968 -0.445980
bar two 1.037674 0.577416
foo one -0.109079 1.840235
foo three 0.007034 0.438671

In [43]:

df.groupby("A").sum()

Out[43]:

CDAbarfoo

-3.187440 0.321915
2.299261 0.893835

In [44]:

df.groupby(["A", "B"]).sum()

Out[44]:

CDABbaronethreetwofooonethreetwo

-1.318101 -0.707263
-2.157672 -0.058876
0.288332 1.088054
2.007540 -0.309369
-0.170809 -0.014424
0.462530 1.217627

 

데이터 재구성 Reshaping

 

스택으로 쌓기 Stack

In [45]:

tuples = list( zip( *[ ["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],

["one", "two", "one", "two", "one", "two", "one", "two"], ] ) )

In [48]:

index = pd.MultiIndex.from_tuples(tuples, names=["first", "second"])

df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=["A", "B"])

df2 = df[:4]

df2

Out[48]:

ABfirstsecondbaronetwobazonetwo

-0.493904 0.650182
-0.154308 -0.494457
1.280971 0.103614
0.519437 -0.421646

In [49]:

stacked = df2.stack()

stacked

Out[49]:

first second bar one A -0.493904 B 0.650182 two A -0.154308 B -0.494457 baz one A 1.280971 B 0.103614 two A 0.519437 B -0.421646 dtype: float64

In [50]:

stacked.unstack()

Out[50]:

ABfirstsecondbaronetwobazonetwo

-0.493904 0.650182
-0.154308 -0.494457
1.280971 0.103614
0.519437 -0.421646

In [51]:

stacked.unstack(1)

Out[51]:

secondonetwofirstbarABbazAB

-0.493904 -0.154308
0.650182 -0.494457
1.280971 0.519437
0.103614 -0.421646

In [52]:

stacked.unstack(0)

Out[52]:

firstbarbazsecondoneABtwoAB

-0.493904 1.280971
0.650182 0.103614
-0.154308 0.519437
-0.494457 -0.421646

 

피봇 테이블 만들기 Pivot tables

In [53]:

df = pd.DataFrame( { "A": ["one", "one", "two", "three"] * 3,

"B": ["A", "B", "C"] * 4,

"C": ["foo", "foo", "foo", "bar", "bar", "bar"] * 2,

"D": np.random.randn(12),

"E": np.random.randn(12), } )

df

Out[53]:

ABCDE01234567891011

one A foo 0.665674 0.080861
one B foo 0.796517 1.000325
two C foo -0.484443 -0.470302
three A bar 1.065156 -1.877210
one B bar 1.064364 -0.550394
one C bar 0.774835 0.079173
two A foo -0.096201 1.014980
three B foo 1.510224 -1.294035
one C foo 0.494093 -0.657508
one A bar -1.322677 0.646481
two B bar 1.910515 -2.413304
three C bar -0.944018 0.843925

In [54]:

pd.pivot_table(df, values="D", index=["A", "B"], columns=["C"])

Out[54]:

CbarfooABoneABCthreeABCtwoABC

-1.322677 0.665674
1.064364 0.796517
0.774835 0.494093
1.065156 NaN
NaN 1.510224
-0.944018 NaN
NaN -0.096201
1.910515 NaN
NaN -0.484443

 

시간 씨리즈 자료 Time series

In [55]:

rng = pd.date_range("1/1/2012", periods=100, freq="S")

ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)

ts.resample("5Min").sum()

Out[55]:

2012-01-01 25382 Freq: 5T, dtype: int32

In [56]:

rng = pd.date_range("3/6/2012 00:00", periods=5, freq="D")

ts = pd.Series(np.random.randn(len(rng)), rng)

ts

Out[56]:

2012-03-06 1.142742 2012-03-07 -0.320065 2012-03-08 0.623021 2012-03-09 1.110096 2012-03-10 0.939973 Freq: D, dtype: float64

In [57]:

ts_utc = ts.tz_localize("UTC")

ts_utc

Out[57]:

2012-03-06 00:00:00+00:00 1.142742 2012-03-07 00:00:00+00:00 -0.320065 2012-03-08 00:00:00+00:00 0.623021 2012-03-09 00:00:00+00:00 1.110096 2012-03-10 00:00:00+00:00 0.939973 Freq: D, dtype: float64

In [59]:

ts_utc.tz_convert("US/Eastern")

Out[59]:

2012-03-05 19:00:00-05:00 1.142742 2012-03-06 19:00:00-05:00 -0.320065 2012-03-07 19:00:00-05:00 0.623021 2012-03-08 19:00:00-05:00 1.110096 2012-03-09 19:00:00-05:00 0.939973 Freq: D, dtype: float64

In [60]:

rng = pd.date_range("1/1/2012", periods=5, freq="M")

ts = pd.Series(np.random.randn(len(rng)), index=rng)

ts

Out[60]:

2012-01-31 0.362341 2012-02-29 -0.192232 2012-03-31 1.470917 2012-04-30 -0.792700 2012-05-31 1.236388 Freq: M, dtype: float64

In [61]:

ps = ts.to_period()

ps

Out[61]:

2012-01 0.362341 2012-02 -0.192232 2012-03 1.470917 2012-04 -0.792700 2012-05 1.236388 Freq: M, dtype: float64

In [62]:

ps.to_timestamp()

Out[62]:

2012-01-01 0.362341 2012-02-01 -0.192232 2012-03-01 1.470917 2012-04-01 -0.792700 2012-05-01 1.236388 Freq: MS, dtype: float64

In [63]:

prng = pd.period_range("1990Q1", "2000Q4", freq="Q-NOV")

ts = pd.Series(np.random.randn(len(prng)), prng)

ts.index = (prng.asfreq("M", "e") + 1).asfreq("H", "s") + 9

ts.head()

Out[63]:

1990-03-01 09:00 0.208071 1990-06-01 09:00 -0.487878 1990-09-01 09:00 0.096101 1990-12-01 09:00 0.189854 1991-03-01 09:00 -1.396860 Freq: H, dtype: float64

 

카테고리형 Categoricals

In [64]:

df = pd.DataFrame( {"id": [1, 2, 3, 4, 5, 6], "raw_grade": ["a", "b", "b", "a", "a", "e"]} )

In [65]:

df["grade"] = df["raw_grade"].astype("category")

df["grade"]

Out[65]:

0 a 1 b 2 b 3 a 4 a 5 e Name: grade, dtype: category Categories (3, object): ['a', 'b', 'e']

In [66]:

df["grade"].cat.categories = ["very good", "good", "very bad"]

In [67]:

df["grade"] = df["grade"].cat.set_categories( ["very bad", "bad", "medium", "good", "very good"] )

df["grade"]

Out[67]:

0 very good 1 good 2 good 3 very good 4 very good 5 very bad Name: grade, dtype: category Categories (5, object): ['very bad', 'bad', 'medium', 'good', 'very good']

In [68]:

df.sort_values(by="grade")

Out[68]:

idraw_gradegrade512034

6 e very bad
2 b good
3 b good
1 a very good
4 a very good
5 a very good

In [69]:

df.groupby("grade").size()

Out[69]:

grade very bad 1 bad 0 medium 0 good 2 very good 3 dtype: int64

 

그래프 출력 Plotting

In [1]:

import matplotlib.pyplot as plt

plt.close("all")

In [6]:

ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000))

ts = ts.cumsum()

ts.plot()

Out[6]:

<AxesSubplot:>

In [7]:

df = pd.DataFrame( np.random.randn(1000, 4), index=ts.index, columns=["A", "B", "C", "D"] )

df = df.cumsum()

plt.figure()

df.plot()

plt.legend(loc='best')

Out[7]:

<matplotlib.legend.Legend at 0x1eb5685e070>

<Figure size 432x288 with 0 Axes>

 

데이터를 파일로 저장하거나 가져오기

 

CSV 파일

In [9]:

df.to_csv("foo.csv")

In [10]:

pd.read_csv("foo.csv")

Out[10]:

Unnamed: 0ABCD01234...995996997998999

2000-01-01 -0.218748 1.702072 0.233375 -1.190326
2000-01-02 -1.703168 1.869696 1.396458 -2.172607
2000-01-03 -1.655573 1.230124 2.194878 -1.128468
2000-01-04 -1.665907 1.776456 2.125951 -1.994653
2000-01-05 -2.855755 2.020966 1.564951 -0.546648
... ... ... ... ...
2002-09-22 -10.015554 -16.983263 -6.563836 -17.592043
2002-09-23 -9.621943 -18.959148 -6.556905 -16.725602
2002-09-24 -9.468149 -18.458281 -6.914683 -15.783066
2002-09-25 -10.299759 -19.652141 -6.971360 -15.748778
2002-09-26 -10.223476 -18.980850 -7.604712 -17.069064

1000 rows × 5 columns

 

HDF5 파일

In [11]:

df.to_hdf("foo.h5", "df")

In [12]:

pd.read_hdf("foo.h5", "df")

Out[12]:

ABCD2000-01-012000-01-022000-01-032000-01-042000-01-05...2002-09-222002-09-232002-09-242002-09-252002-09-26

-0.218748 1.702072 0.233375 -1.190326
-1.703168 1.869696 1.396458 -2.172607
-1.655573 1.230124 2.194878 -1.128468
-1.665907 1.776456 2.125951 -1.994653
-2.855755 2.020966 1.564951 -0.546648
... ... ... ...
-10.015554 -16.983263 -6.563836 -17.592043
-9.621943 -18.959148 -6.556905 -16.725602
-9.468149 -18.458281 -6.914683 -15.783066
-10.299759 -19.652141 -6.971360 -15.748778
-10.223476 -18.980850 -7.604712 -17.069064

1000 rows × 4 columns

 

엑셀 파일 Excel

In [13]:

df.to_excel("foo.xlsx", sheet_name="Sheet1")

In [14]:

pd.read_excel("foo.xlsx", "Sheet1", index_col=None, na_values=["NA"])

Out[14]:

Unnamed: 0ABCD01234...995996997998999

2000-01-01 -0.218748 1.702072 0.233375 -1.190326
2000-01-02 -1.703168 1.869696 1.396458 -2.172607
2000-01-03 -1.655573 1.230124 2.194878 -1.128468
2000-01-04 -1.665907 1.776456 2.125951 -1.994653
2000-01-05 -2.855755 2.020966 1.564951 -0.546648
... ... ... ... ...
2002-09-22 -10.015554 -16.983263 -6.563836 -17.592043
2002-09-23 -9.621943 -18.959148 -6.556905 -16.725602
2002-09-24 -9.468149 -18.458281 -6.914683 -15.783066
2002-09-25 -10.299759 -19.652141 -6.971360 -15.748778
2002-09-26 -10.223476 -18.980850 -7.604712 -17.069064

1000 rows × 5 columns

 

에러 처리 Gotchas

반환된 자료의 참/거짓 확인은 a.empty, a.any(), a.all(), a.bool(), a.item() 이용 권장

In [93]:

if pd.Series([False, True, False]):

    print("I was true")

''' Traceback ... ValueError:

The truth value of an array is ambiguous. Use a.empty, a.any() or a.all(). '''

 

<이상>

반응형

+ Recent posts