<참조> 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(). '''
<이상>
'Python 활용' 카테고리의 다른 글
Python SQLite DB 쿼리 레퍼런스 (0) | 2021.07.31 |
---|---|
파이썬, 추억의 오락실 게임 만들기 (pygame) (0) | 2021.06.08 |
엑셀 데이터 전처리 쉽게하기 (0) | 2021.05.08 |
엑셀 데이터 전처리 (Python / Pandas) (0) | 2021.05.07 |
파이썬, 미디 파일 구조 분석용 코드 예제 (0) | 2021.04.24 |