10 Minutes to pandas
초보자를 위한 Pandas 소개
- 자세한 내용은’cookbook‘참조
- pandas 0.24.1 documentation
1. 라이브러리
import numpy as np
import pandas as pd
- 최종 결과뿐만 아니라 모든 Output 출력을 표시하기
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
2. 객체 생성
값 리스트를 전달하여 pandas가 기본 정수 인덱스를 생성하도록 Series 만들기
s = pd.Series([1,3,5, np.nan, 6,8])
s
Out[4]:
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
datetime 인덱스와 레이블된 열이 있는 NumPy배열을 전달하여 DataFrame 만들기
dates=pd.date_range('20130101',periods=6)
dates
df=pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
Out[5]:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
Out[5]:
A B C D
2013-01-01 -1.313690 0.374085 0.143973 -0.624099
2013-01-02 -0.659125 -0.595977 0.403210 0.814707
2013-01-03 0.105771 0.338891 -0.404629 0.032208
2013-01-04 0.376774 -0.035958 -0.659694 0.261746
2013-01-05 0.317915 1.052522 -0.794585 1.480261
2013-01-06 0.579203 1.709605 -0.546063 0.336379
직렬로 변환 할 수 있는 개체의 지시를 전달하여 DataFrame 만들기
df2=pd.DataFrame({'A':1.,
'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[6]:
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
DataFrame의 열은 다른 dtypes를 가진다.
df2.dtypes
Out[7]:
A float64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
3. 데이터 확인하기
프레임의 상단과 하단 부분을 보기
df.head()
df.tail(3) #하단부분 3열만 본다는 뜻
Out[8]:
A B C D
2013-01-01 -1.313690 0.374085 0.143973 -0.624099
2013-01-02 -0.659125 -0.595977 0.403210 0.814707
2013-01-03 0.105771 0.338891 -0.404629 0.032208
2013-01-04 0.376774 -0.035958 -0.659694 0.261746
2013-01-05 0.317915 1.052522 -0.794585 1.480261
Out[8]:
A B C D
2013-01-04 0.376774 -0.035958 -0.659694 0.261746
2013-01-05 0.317915 1.052522 -0.794585 1.480261
2013-01-06 0.579203 1.709605 -0.546063 0.336379
인덱스와 상단 열 표시 (Index, Columns)
df.index
df.columns
Out[9]:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
Out[9]:
Index(['A', 'B', 'C', 'D'], dtype='object')
DataFrame.to_numpy()는 기본 데이터의 NumPy표현을 제공합니다. DataFrame에 다른 데이터 유형의 열이 있는 경우 힘든 작업이 될 수 있습니다.
pandas와 NumPy의 근본적인 차이가 있습니다. Numpy 배열에는 전채 배열에 대한 하나의 dtype이 있는 반면, pandas의 DataFrames에는 각각의 열마다 각각의 dtype이 있습니다.
DataFrmae.to_numpy()를 불러오면 pandas는 DataFrame의 모든 dtype을 포함 할 수 있는 NumPy dtype을 찾습니다. object가 바로 모든 값을 아우를 수 있는 dtype이 될 수 있습니다.
모든 부동 소수점 값의 DataFrame인 df 경우 DataFrame.to_numpy()가 빠르며 데이터 복사가 필요하지 않습니다.
- DataFrame.to_numpy()는 index와 column 레이블을 포함하지 않습니다.
df.to_numpy()
df.values
Out[10]:
array([[-1.31368999, 0.37408481, 0.14397347, -0.6240987 ],
[-0.65912479, -0.59597727, 0.40321046, 0.81470747],
[ 0.10577142, 0.33889057, -0.40462934, 0.03220843],
[ 0.37677379, -0.03595848, -0.65969389, 0.26174625],
[ 0.31791509, 1.05252188, -0.79458461, 1.48026149],
[ 0.57920326, 1.70960542, -0.54606269, 0.33637945]])
Out[10]:
array([[-1.31368999, 0.37408481, 0.14397347, -0.6240987 ],
[-0.65912479, -0.59597727, 0.40321046, 0.81470747],
[ 0.10577142, 0.33889057, -0.40462934, 0.03220843],
[ 0.37677379, -0.03595848, -0.65969389, 0.26174625],
[ 0.31791509, 1.05252188, -0.79458461, 1.48026149],
[ 0.57920326, 1.70960542, -0.54606269, 0.33637945]])
df2의 DataFrame 은 여러 dtypes을 가지고 있다.
df2.to_numpy()
Out[11]:
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)
describe() 는 데이터의 빠른 통계 요약을 보여준다.
df.describe()
Out[12]:
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean -0.098859 0.473861 -0.309631 0.383534
std 0.733660 0.811733 0.476770 0.713377
min -1.313690 -0.595977 -0.794585 -0.624099
25% -0.467901 0.057754 -0.631286 0.089593
50% 0.211843 0.356488 -0.475346 0.299063
75% 0.362059 0.882913 0.006823 0.695125
max 0.579203 1.709605 0.403210 1.480261
열과 행을 바꾸기 원할 때 df.T를 씁니다.
df.T
Out[13]:
2013-01-01 00:00:00 2013-01-02 00:00:00 2013-01-03 00:00:00 2013-01-04 00:00:00 2013-01-05 00:00:00 2013-01-06 00:00:00
A -1.313690 -0.659125 0.105771 0.376774 0.317915 0.579203
B 0.374085 -0.595977 0.338891 -0.035958 1.052522 1.709605
C 0.143973 0.403210 -0.404629 -0.659694 -0.794585 -0.546063
D -0.624099 0.814707 0.032208 0.261746 1.480261 0.336379
축별 정렬
df.sort_index(axis=1, ascending=False)
Out[14]:
D C B A
2013-01-01 -0.624099 0.143973 0.374085 -1.313690
2013-01-02 0.814707 0.403210 -0.595977 -0.659125
2013-01-03 0.032208 -0.404629 0.338891 0.105771
2013-01-04 0.261746 -0.659694 -0.035958 0.376774
2013-01-05 1.480261 -0.794585 1.052522 0.317915
2013-01-06 0.336379 -0.546063 1.709605 0.579203
값들 정렬
df.sort_values(by='B')
Out[15]:
A B C D
2013-01-02 -0.659125 -0.595977 0.403210 0.814707
2013-01-04 0.376774 -0.035958 -0.659694 0.261746
2013-01-03 0.105771 0.338891 -0.404629 0.032208
2013-01-01 -1.313690 0.374085 0.143973 -0.624099
2013-01-05 0.317915 1.052522 -0.794585 1.480261
2013-01-06 0.579203 1.709605 -0.546063 0.336379
4.선택
- 선택 및 설정을 위한 표준 Python/Numpy 표현은 직관적이며 양방향 작업, 프로덕션 코드 용으로 유용하지만 최적화 된 pandas 데이터 액세스 방법인 .at, .iat, .loc 및 .iloc을 권장합니다.
가져오기
df.A와 동등한 Series을 생성하는 단일 열 선택
df['A'] #[열]Column
Out[16]:
2013-01-01 -1.313690
2013-01-02 -0.659125
2013-01-03 0.105771
2013-01-04 0.376774
2013-01-05 0.317915
2013-01-06 0.579203
Freq: D, Name: A, dtype: float64
[ ]을 통해 행을 선택합니다.
df[0:3] #[행]Row
df['20130102':'20130104']
Out[17]:
A B C D
2013-01-01 -1.313690 0.374085 0.143973 -0.624099
2013-01-02 -0.659125 -0.595977 0.403210 0.814707
2013-01-03 0.105771 0.338891 -0.404629 0.032208
Out[17]:
A B C D
2013-01-02 -0.659125 -0.595977 0.403210 0.814707
2013-01-03 0.105771 0.338891 -0.404629 0.032208
2013-01-04 0.376774 -0.035958 -0.659694 0.261746
레이블에 따라 선택하기
레이블에 의하여 값 얻기
df.loc[dates[0]] #[행]
Out[18]:
A -1.313690
B 0.374085
C 0.143973
D -0.624099
Name: 2013-01-01 00:00:00, dtype: float64
레이블 별로 다중 축 선택하기
df.loc[:, ['A','B']] #[행,열]
Out[19]:
A B
2013-01-01 -1.313690 0.374085
2013-01-02 -0.659125 -0.595977
2013-01-03 0.105771 0.338891
2013-01-04 0.376774 -0.035958
2013-01-05 0.317915 1.052522
2013-01-06 0.579203 1.709605
레이블 슬라이싱
df.loc['20130102':'20130104',['A','B']]
Out[20]:
A B
2013-01-02 -0.659125 -0.595977
2013-01-03 0.105771 0.338891
2013-01-04 0.376774 -0.035958
df.loc['20130102',['A','B']]
Out[21]:
A -0.659125
B -0.595977
Name: 2013-01-02 00:00:00, dtype: float64
스칼라값 얻기
df.loc[dates[0],'A']
Out[22]:
-1.313689989467988
스칼라값 빨리 얻기 (이전 방법과 동일)
df.at[dates[0],'A']
Out[23]:
-1.313689989467988
위치에 의한 선택
전달된 정수 위치를 통해 선택
df.iloc[3]
Out[24]:
A 0.376774
B -0.035958
C -0.659694
D 0.261746
Name: 2013-01-04 00:00:00, dtype: float64
numpy/python과 유사한 interger slices
df.iloc[3:5, 0:2] #[행,열]
Out[25]:
A B
2013-01-04 0.376774 -0.035958
2013-01-05 0.317915 1.052522
numpy/python 스타일과 비슷한 정수 위치 리스트
df.iloc[[1,2,4],[0,2]]
Out[26]:
A C
2013-01-02 -0.659125 0.403210
2013-01-03 0.105771 -0.404629
2013-01-05 0.317915 -0.794585
행을 분할하기
df.iloc[1:3,:]
Out[27]:
A B C D
2013-01-02 -0.659125 -0.595977 0.403210 0.814707
2013-01-03 0.105771 0.338891 -0.404629 0.032208
열을 분할하기
df.iloc[:,1:3]
Out[28]:
B C
2013-01-01 0.374085 0.143973
2013-01-02 -0.595977 0.403210
2013-01-03 0.338891 -0.404629
2013-01-04 -0.035958 -0.659694
2013-01-05 1.052522 -0.794585
2013-01-06 1.709605 -0.546063
특정한 하나의 값 찾기
df.iloc[1,1]
Out[29]:
-0.5959772742174114
더 빠르게 스칼라 찾기 (전 방법과 동등)
df.iat[1,1]
Out[30]:
-0.5959772742174114
Boolean Indexing
단일 열의 값을 사용하여 데이터를 선택하기
df[df.A>0]
Out[31]:
A B C D
2013-01-03 0.105771 0.338891 -0.404629 0.032208
2013-01-04 0.376774 -0.035958 -0.659694 0.261746
2013-01-05 0.317915 1.052522 -0.794585 1.480261
2013-01-06 0.579203 1.709605 -0.546063 0.336379
Boolean 조건이 충족되는 DataFrame에서 값을 선택합니다.
df[df>0]
Out[32]:
A B C D
2013-01-01 NaN 0.374085 0.143973 NaN
2013-01-02 NaN NaN 0.403210 0.814707
2013-01-03 0.105771 0.338891 NaN 0.032208
2013-01-04 0.376774 NaN NaN 0.261746
2013-01-05 0.317915 1.052522 NaN 1.480261
2013-01-06 0.579203 1.709605 NaN 0.336379
필터링 기법인 isin() 방법 사용하기
df2=df.copy()
df2['E']=['one','one','two','three','four','three']
df2
df2[df2['E'].isin(['two','four'])]
Out[33]:
A B C D E
2013-01-01 -1.313690 0.374085 0.143973 -0.624099 one
2013-01-02 -0.659125 -0.595977 0.403210 0.814707 one
2013-01-03 0.105771 0.338891 -0.404629 0.032208 two
2013-01-04 0.376774 -0.035958 -0.659694 0.261746 three
2013-01-05 0.317915 1.052522 -0.794585 1.480261 four
2013-01-06 0.579203 1.709605 -0.546063 0.336379 three
Out[33]:
A B C D E
2013-01-03 0.105771 0.338891 -0.404629 0.032208 two
2013-01-05 0.317915 1.052522 -0.794585 1.480261 four
설정하기
새 열을 설정하면 데이터를 인덱스별로 자동 정렬합니다.
s1=pd.Series([1,2,3,4,5,6],index=pd.date_range('20130102',periods=6))
s1
df['F']=s1
Out[34]:
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
레이블별 값 설정
df.at[dates[0],'A']=0
위치별 값 설정
df.iat[0,1]=0
NumPy 배열을 지정하여 설정
df.loc[:,'D']=np.array([5]*len(df))
설정 작업 결과
df
Out[38]:
A B C D F
2013-01-01 0.000000 0.000000 0.143973 5 NaN
2013-01-02 -0.659125 -0.595977 0.403210 5 1.0
2013-01-03 0.105771 0.338891 -0.404629 5 2.0
2013-01-04 0.376774 -0.035958 -0.659694 5 3.0
2013-01-05 0.317915 1.052522 -0.794585 5 4.0
2013-01-06 0.579203 1.709605 -0.546063 5 5.0
where 작동 설정하기
df2=df.copy()
df2[df2>0]=-df2
df2
Out[39]:
A B C D F
2013-01-01 0.000000 0.000000 -0.143973 -5 NaN
2013-01-02 -0.659125 -0.595977 -0.403210 -5 -1.0
2013-01-03 -0.105771 -0.338891 -0.404629 -5 -2.0
2013-01-04 -0.376774 -0.035958 -0.659694 -5 -3.0
2013-01-05 -0.317915 -1.052522 -0.794585 -5 -4.0
2013-01-06 -0.579203 -1.709605 -0.546063 -5 -5.0
5. 누락된 데이터
pandas는 기본적으로 누락된 데이터를 np.nan값을 사용하여 나타냅니다. 이 값들은 계산에 포합되지 않습니다.
reindex를 통해 지정된 축의 인덱스를 변경/추가/삭제할 수 있습니다.
df1=df.reindex(index=dates[0:4], columns=list(df.columns)+['E'])
df1.loc[dates[0]:dates[1],'E']=1
df1
Out[41]:
A B C D F E
2013-01-01 0.000000 0.000000 0.143973 5 NaN 1.0
2013-01-02 -0.659125 -0.595977 0.403210 5 1.0 1.0
2013-01-03 0.105771 0.338891 -0.404629 5 2.0 NaN
2013-01-04 0.376774 -0.035958 -0.659694 5 3.0 NaN
데이터가 누락된 행을 삭제합니다.
df1.dropna(how='any')
Out[42]:
A B C D F E
2013-01-02 -0.659125 -0.595977 0.40321 5 1.0 1.0
누락된 데이터를 채웁니다.
df1.fillna(value=5)
Out[43]:
A B C D F E
2013-01-01 0.000000 0.000000 0.143973 5 5.0 1.0
2013-01-02 -0.659125 -0.595977 0.403210 5 1.0 1.0
2013-01-03 0.105771 0.338891 -0.404629 5 2.0 5.0
2013-01-04 0.376774 -0.035958 -0.659694 5 3.0 5.0
nan인 값을 boolean mask로 얻기
pd.isna(df1)
Out[45]:
A B C D F E
2013-01-01 False False False False True False
2013-01-02 False False False False False False
2013-01-03 False False False False False True
2013-01-04 False False False False False True
6. 작업
통계
일반적으로 누락된 데이터는 제외합니다.
기술적 통계 수행
df.mean()
Out[46]:
A 0.120090
B 0.411514
C -0.309631
D 5.000000
F 3.000000
dtype: float64
다른 축에서 동일한 작업 #dates별로 평균내기
df.mean(1)
Out[47]:
2013-01-01 1.285993
2013-01-02 1.029622
2013-01-03 1.408007
2013-01-04 1.536224
2013-01-05 1.915170
2013-01-06 2.348549
Freq: D, dtype: float64
차원이 다르고 정렬이 필요한 객체로 작업하기.
추가로 pandas는 지정된 차원에 따라 자동으로 제공됩니다.
s=pd.Series([1,3,5,np.nan,6,8],index=dates).shift(2) #shift(2)는 series값을 두캄 미룬다는 뜻
s
df.sub(s,axis='index') #df값에서 s를 뺀 것
Out[51]:
2013-01-01 NaN
2013-01-02 NaN
2013-01-03 1.0
2013-01-04 3.0
2013-01-05 5.0
2013-01-06 NaN
Freq: D, dtype: float64
Out[51]:
A B C D F
2013-01-01 NaN NaN NaN NaN NaN
2013-01-02 NaN NaN NaN NaN NaN
2013-01-03 -0.894229 -0.661109 -1.404629 4.0 1.0
2013-01-04 -2.623226 -3.035958 -3.659694 2.0 0.0
2013-01-05 -4.682085 -3.947478 -5.794585 0.0 -1.0
2013-01-06 NaN NaN NaN NaN NaN
적용
데이터에 함수 적용하기
df
Out[53]:
A B C D F
2013-01-01 0.000000 0.000000 0.143973 5 NaN
2013-01-02 -0.659125 -0.595977 0.403210 5 1.0
2013-01-03 0.105771 0.338891 -0.404629 5 2.0
2013-01-04 0.376774 -0.035958 -0.659694 5 3.0
2013-01-05 0.317915 1.052522 -0.794585 5 4.0
2013-01-06 0.579203 1.709605 -0.546063 5 5.0
df.apply(np.cumsum) #누적값
df.apply(lambda x: x.max()-x.min())
Out[52]:
A B C D F
2013-01-01 0.000000 0.000000 0.143973 5 NaN
2013-01-02 -0.659125 -0.595977 0.547184 10 1.0
2013-01-03 -0.553353 -0.257087 0.142555 15 3.0
2013-01-04 -0.176580 -0.293045 -0.517139 20 6.0
2013-01-05 0.141336 0.759477 -1.311724 25 10.0
2013-01-06 0.720539 2.469082 -1.857787 30 15.0
Out[52]:
A 1.238328
B 2.305583
C 1.197795
D 0.000000
F 4.000000
dtype: float64
막대그래프
s=pd.Series(np.random.randint(0,7, size=10)) #randit() 함수 정수 랜덤값을 생성해주는 함수
s
s.value_counts() #각 값들 카운트
Out[62]:
0 2
1 4
2 5
3 1
4 0
5 0
6 3
7 4
8 4
9 5
dtype: int32
Out[62]:
4 3
5 2
0 2
3 1
2 1
1 1
dtype: int64
문자열 처리 (String Methods)
Series에는 str 속성에 일련의 문자열처리 방법이 있으므로 배열의 각 요소를 쉽게 조작할 수 있습니다. str의 패턴은 보통 정규식을 사용합니다.(경우에 따라 항상 사용하는 경우도 있습니다.)
s=pd.Series(['A','B','C','Aaba','Baca',np.nan, 'CABA','dog','cat'])
s.str.lower()
Out[63]:
0 a
1 b
2 c
3 aaba
4 baca
5 NaN
6 caba
7 dog
8 cat
dtype: object
Comments