10분 pandas 실습
참고 사이트
10분은 개뿔....
import numpy as np
import pandas as pd
오브젝트 생성¶
Series 오브젝트 생성
s= pd.Series([1,3,5,np.nan,6,8])
s
0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64
DataFrame 오브젝트 생성
dates= pd.date_range("20130101",periods=6) #pandas 내장 함수를 이용해 20130101부터 6일 까지의 리스트를 만듬
dates
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'], dtype='datetime64[ns]', freq='D')
df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=list("ABCD")) #가우시안 표준 정규분포에서 난수 matrix array생성f=pd.DataFrame(np.random.randn(6,4),index=dates,columns=list("ABCD")) #가우시안 표준 정규분포에서 난수 matrix array생성
df
A | B | C | D | |
---|---|---|---|---|
2013-01-01 | 0.076484 | 0.747200 | 0.378133 | -0.459580 |
2013-01-02 | 0.331515 | -0.308679 | 2.492327 | 1.544272 |
2013-01-03 | 0.175129 | 1.136551 | 1.649191 | 1.887292 |
2013-01-04 | -0.602191 | 0.424951 | 1.219719 | 0.728339 |
2013-01-05 | -0.289813 | 0.310278 | 1.205465 | 1.814098 |
2013-01-06 | 0.123148 | 2.174075 | -0.157369 | -0.103182 |
직렬로 변환할수있는 dict형을 데이터 프레임으로 생성한다.
df2= pd.DataFrame({#keys는 자동으로 열의 이름이 된다.
"A":1.0, #비어있는 값들에 전부 1.0이 들어감
"B":pd.Timestamp("20130102"),
"C":pd.Series(1,index=list(range(4)),dtype="float32"),
"D":np.array([3]*4,dtype="int32"),# 배열 3 , 3, 3, 3 생긴거 차례대로 들어감.
"E":pd.Categorical(["test","train","test","train"]),
"F":"foo"})
df2
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
0 | 1.0 | 2013-01-02 | 1.0 | 3 | test | foo |
1 | 1.0 | 2013-01-02 | 1.0 | 3 | train | foo |
2 | 1.0 | 2013-01-02 | 1.0 | 3 | test | foo |
3 | 1.0 | 2013-01-02 | 1.0 | 3 | train | foo |
df2.dtypes
A float64 B datetime64[ns] C float32 D int32 E category F object dtype: object
Data 보기¶
df.head()#상위 몇개 보기
df.tail(3)#하위 몇개 보기
<bound method NDFrame.tail of A B C D 2013-01-01 0.076484 0.747200 0.378133 -0.459580 2013-01-02 0.331515 -0.308679 2.492327 1.544272 2013-01-03 0.175129 1.136551 1.649191 1.887292 2013-01-04 -0.602191 0.424951 1.219719 0.728339 2013-01-05 -0.289813 0.310278 1.205465 1.814098 2013-01-06 0.123148 2.174075 -0.157369 -0.103182>
df.index #df의 인덱스들(행의 이름)만 보기
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'], dtype='datetime64[ns]', freq='D')
df.columns #df의 열의 이름들 보기
Index(['A', 'B', 'C', 'D'], dtype='object')
Numpy배열은 전체 배열에 대해 하나의 dtype을 가지고있고, pandas DataFrame은 열당 하나의 dtype을 가진다. Numpy를 사용해서 dataFrame을 불러오려면 모든 dtype을 저장할 수 있는 Numpy 유형을 찾기때문에 모든 값들을 따로 Python 객체에 캐스팅 해야한다는 뜻이다. 그래서 Numpy로 DataFrame을 작업하려면 많은 것을 감당해야한다.
여기서 df는 하나의 dtype이므로 DataFrame.to_numpy()를 사용하면 빠르고 데이터 복사가 필요없다.
df.to_numpy()
array([[ 0.07648391, 0.74719975, 0.37813257, -0.4595797 ], [ 0.33151464, -0.30867886, 2.49232684, 1.54427172], [ 0.17512946, 1.13655097, 1.64919136, 1.88729241], [-0.60219069, 0.42495131, 1.21971929, 0.72833864], [-0.28981328, 0.31027806, 1.20546499, 1.81409759], [ 0.12314811, 2.17407458, -0.15736865, -0.10318153]])
df2는 다양한 dtype이라 비용이 크다.
df2.to_numpy()
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)
Note : DataFrame.to_numpy()는 index와 columns 라벨을 출력하지않는다.
describe()는 데이터의 분석결과를 요약해서 보여준다.
df.describe()
A | B | C | D | |
---|---|---|---|---|
count | 6.000000 | 6.000000 | 6.000000 | 6.000000 |
mean | -0.030955 | 0.747396 | 1.131244 | 0.901873 |
std | 0.347121 | 0.848197 | 0.934008 | 1.010909 |
min | -0.602191 | -0.308679 | -0.157369 | -0.459580 |
25% | -0.198239 | 0.338946 | 0.584966 | 0.104699 |
50% | 0.099816 | 0.586076 | 1.212592 | 1.136305 |
75% | 0.162134 | 1.039213 | 1.541823 | 1.746641 |
max | 0.331515 | 2.174075 | 2.492327 | 1.887292 |
데이터 전송??
df.T
2013-01-01 | 2013-01-02 | 2013-01-03 | 2013-01-04 | 2013-01-05 | 2013-01-06 | |
---|---|---|---|---|---|---|
A | 0.076484 | 0.331515 | 0.175129 | -0.602191 | -0.289813 | 0.123148 |
B | 0.747200 | -0.308679 | 1.136551 | 0.424951 | 0.310278 | 2.174075 |
C | 0.378133 | 2.492327 | 1.649191 | 1.219719 | 1.205465 | -0.157369 |
D | -0.459580 | 1.544272 | 1.887292 | 0.728339 | 1.814098 | -0.103182 |
정렬하는 함수 sort
sort_index는 인덱스 기준 정렬
df.sort_index(axis=0,ascending=False)
#axis가 0이면 열 기준 정렬 (ABCD)
#axis가 1이면 행 기준 정렬 (날짜)
A | B | C | D | |
---|---|---|---|---|
2013-01-06 | 0.123148 | 2.174075 | -0.157369 | -0.103182 |
2013-01-05 | -0.289813 | 0.310278 | 1.205465 | 1.814098 |
2013-01-04 | -0.602191 | 0.424951 | 1.219719 | 0.728339 |
2013-01-03 | 0.175129 | 1.136551 | 1.649191 | 1.887292 |
2013-01-02 | 0.331515 | -0.308679 | 2.492327 | 1.544272 |
2013-01-01 | 0.076484 | 0.747200 | 0.378133 | -0.459580 |
sort_values는 데이터 값 기준 정렬
df.sort_values(by="B") #B 열을 기준으로 정렬
A | B | C | D | |
---|---|---|---|---|
2013-01-02 | 0.331515 | -0.308679 | 2.492327 | 1.544272 |
2013-01-05 | -0.289813 | 0.310278 | 1.205465 | 1.814098 |
2013-01-04 | -0.602191 | 0.424951 | 1.219719 | 0.728339 |
2013-01-01 | 0.076484 | 0.747200 | 0.378133 | -0.459580 |
2013-01-03 | 0.175129 | 1.136551 | 1.649191 | 1.887292 |
2013-01-06 | 0.123148 | 2.174075 | -0.157369 | -0.103182 |
하나의 열만 보고싶을때 df["열이름"]
df["A"]
2013-01-01 0.076484 2013-01-02 0.331515 2013-01-03 0.175129 2013-01-04 -0.602191 2013-01-05 -0.289813 2013-01-06 0.123148 Freq: D, Name: A, dtype: float64
행 슬라이싱
df[행번호: 행번호] or df["행이름":"행이름"]
df[0:3]
A | B | C | D | |
---|---|---|---|---|
2013-01-01 | 0.076484 | 0.747200 | 0.378133 | -0.459580 |
2013-01-02 | 0.331515 | -0.308679 | 2.492327 | 1.544272 |
2013-01-03 | 0.175129 | 1.136551 | 1.649191 | 1.887292 |
df["20130102":"20130104"]
A | B | C | D | |
---|---|---|---|---|
2013-01-02 | 0.331515 | -0.308679 | 2.492327 | 1.544272 |
2013-01-03 | 0.175129 | 1.136551 | 1.649191 | 1.887292 |
2013-01-04 | -0.602191 | 0.424951 | 1.219719 | 0.728339 |
label을 통한 선택¶
df.loc[라벨]
df
A | B | C | D | |
---|---|---|---|---|
2013-01-01 | 0.076484 | 0.747200 | 0.378133 | -0.459580 |
2013-01-02 | 0.331515 | -0.308679 | 2.492327 | 1.544272 |
2013-01-03 | 0.175129 | 1.136551 | 1.649191 | 1.887292 |
2013-01-04 | -0.602191 | 0.424951 | 1.219719 | 0.728339 |
2013-01-05 | -0.289813 | 0.310278 | 1.205465 | 1.814098 |
2013-01-06 | 0.123148 | 2.174075 | -0.157369 | -0.103182 |
df.loc[dates[0]] # 리스트 dates[0] = 20130102 , 라벨이 20130102인 행 출력
A 0.076484 B 0.747200 C 0.378133 D -0.459580 Name: 2013-01-01 00:00:00, dtype: float64
여러 축의 라벨을 사용하여 선택 할 수 있다. df.loc[ 행, 열 ]
df.loc[:,["A","B"]]
A | B | |
---|---|---|
2013-01-01 | 0.076484 | 0.747200 |
2013-01-02 | 0.331515 | -0.308679 |
2013-01-03 | 0.175129 | 1.136551 |
2013-01-04 | -0.602191 | 0.424951 |
2013-01-05 | -0.289813 | 0.310278 |
2013-01-06 | 0.123148 | 2.174075 |
matplotlib쓰려면 데이터들을 전부 list로 반환해줘야한다.
pandas를 써도 matplotlib을 쓰려면 데이터프레임들을 list로 반환시켜야함.
matplotlib -->리스트 자료형 받음
seaborn -->판다스 자료형 받음. dataFrame자료형도 받는다. ggplot이랑 유사하다.
install_url
to use ShareThis. Please set it in _config.yml
.