Python Pandas
Pandas란?
- Python Data Analysis Library의 약어로 데이터 분석을 하기 위해서 사용되는 필수 Package
Dataframe
개념 효율적으로 관리를 위함- Numpy, Pyarrow Library가 기반이 된다.
- 같은 Int type이라도 여러 개 존재 (
Int64
,int64
,int32
.. ) - 참고
1
2
$ pip install pandas
$ pip install pyarrow
Dataframe
pd.Dataframe
- 다양한 Datatype을 이용하여 Row,Col 형태로 표현
-
개념적으로는 Series들을 하나의 Column으로 취급한 Set
1 2
# Df to dict pd.DataFrame(d.items())
Dtype
- df.astype
- Dataframe type 변경 - Dictionary,Column을 통해
- pd.to_numeric
- float64로 변경
- pd.to_datetime
- datetime 변경
1 2
import pandas as pd df = pd.DataFrame(flatten_data)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#https://stackoverflow.com/questions/21287624/convert-pandas-column-containing-nans-to-dtype-int pandas에서 Null값도 처리하여 주고 싶다면 Int64로 사용 df['col'] = df['col'].astype('col') # Dtype Object -> Float64 # pandas version < 0.17 # https://stackoverflow.com/questions/28277137/how-to-convert-datatypeobject-to-float64-in-python df = df.convert_objects(convert_numeric=True) # pandas version >= 0.17 df["col"] = pd.to_numeric(df["col"]) # Dtype Unix-> Datetime # https://stackoverflow.com/questions/19231871/convert-unix-time-to-readable-date-in-pandas-dataframe df[key] = pd.to_datetime(df[key], unit='ms', origin='unix') # Dtype String->boolean # https://stackoverflow.com/questions/17702272/convert-pandas-series-containing-string-to-boolean d = {'Delivered': True, 'Undelivered': False} df['col'].map(d) # 문자열처리 방식cnt df[key]=df[key].replace({'nan':None})
map
- column data mapping
Column
- drop
- column
1 2 3 4 5 6
df.drop(columns = ['A']) # 한 개 열을 삭제할 때. df.drop(columns = ['A','B']) #여러개 열을 삭제할 때. # columns를 안쓰고 axis 설정을 통해 삭제도 가능하다 df.drop('A', axis = 1) #한 개 열을 삭제할 때. df.drop(['A', 'B'], axis = 1) #여러개 열을 삭제할 때.
- row
1 2
df.drop(0) # index 중 0 행 삭제, axis의 default값이 axis = 0이기 때문에 안쳐도 된다. df.drop([1,2]) # 여러 행 삭제 - 1, 2 행을 삭제했다. 0과 3행만 남음
- column
- slicing
- loc
- 칼럼 Labeling 방식
- df.loc[ row index value , col index value ]
- To select rows - 참고
1 2 3 4 5 6
# To select rows whose column value equals a scalar df.loc[df['column_name'] == some_value] # To select rows whose column value is in an iterable df.loc[df['column_name'].isin(some_values)] # Combine multiple conditions with & df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]
- Appending column totals - 참고
1 2
df['Total'] = df.sum(axis=1) df.loc['Total']= df.sum()
1 2 3 4 5
df.loc[:,'B':] # B열부터 끝까지 출력 df.loc[:,'A':'B'] # A열부터 B열까지 출력 df.loc[1:] # 1행부터 끝까지 출력 df.loc[2:3] # 2행부터 3행까지 출력
- iloc
- 숫자 index로만 접근이 가능
- df.iloc[ row index value , col index value]
1 2 3 4 5 6 7
# delete column df.iloc[:, 1:] # 0번째 column을 삭제하고 나머지만 남긴다. df.iloc[:,2:] # 0번째, 1번째 column 삭제 뒤 나머지만 남기기. df.iloc[1:] # 0번째 행 삭제하고 나머지 추출 df.iloc[1:3] # 1번째 행부터 2번째 행까지만 출력하여 0행과 3행을 삭제한다. df[1:] # row는 일반 슬라이싱이 defalut로 설정되어있어, iloc 없이도 index 슬라이싱으로 바로 삭제 가능하다.
- loc
index
- rename
- index
1 2
# index 재설정 df.index = ['new_idx1', 'new_idx2']
- columns
- difference
- 해당 칼럼들을 제외하고 Dataframe을 추출한다.
- A,B,C,D,E 칼럼이 있을 때
df[df.columns.difference(['B', 'C', 'D', 'E'])]
A 칼럼만 추출하여 보여준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC')) df Out: A B C 0 1 2 3 1 4 5 6 df.rename( index={1:'a'} ) Out: B C A a 2 3 4 5 6 df1.rename(columns={'B': 'BB'}) Out: BB C A 1 2 3 4 5 6
- difference
- set_index
1 2 3 4 5 6 7 8 9 10 11 12 13 14
df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC')) df Out: A B C 0 1 2 3 1 4 5 6 df = df.set_index('A') df Out: B C A 1 2 3 4 5 6
- reset_index
- index 값을 풀어주어 Column 값으로
1
df_user_inflow.groupby(['generated_date', 'datatype']).agg({'cnt': "sum"}).reset_index()
- stack
- column → index 추가, index level up
1 2 3 4 5 6 7 8 9 10 11 12 13
import pandas as pd df = pd.DataFrame({'col_1':[1,2]},index=['one','two']) > col_1 one 1 two 2 stack = df.stack() stack.index > multiindex one col_1 1 two col_1 2
- unstack
- index → column 추가, index level down
- level 을 지정하여 지정된 index 처리 가능 -
df.unstack(level=0)
- 여러 index를 지정하고 싶으면 param list -
df.unstack(['index_name1','index_name2'])
1 2 3 4 5 6 7 8 9 10 11 12 13
df = pd.DataFrame({'col_1':[1,2],'col_2':[3,4]},index=['one','two']) stack = df.copy().stack() > one col_1 1 col_2 3 two col_1 2 col_2 4 unstack = stack.unstack() > col_1 col_2 one 1 3 two 2 4
Apply
1
2
3
```python
df[’A’].apply(func)
```
assign
-
add column
1 2 3 4
# add column # https://stackoverflow.com/questions/12555323/how-to-add-a-new-column-to-an-existing-dataframe length = df.shape[0] df.assign({column_name}=pd.Series([{value}]*length))
Group By
- 집계연산과 함께 쓰는 경우 - sum,count,max,mean,min
- multi column group by - list
1
2
3
4
5
6
7
8
# 단일인 경우
df.groupby(groupcol)[계산하고싶은col].집계함수()
# 다중인 경우
df.groupby([col1,col2]).agg({cal_col:집계함수,cal_col:집계함수})
df_user_inflow.groupby(['name', 'class']).sum()
df_user_inflow.groupby(['generated_date', 'datatype']).agg({'cnt': "sum"}).reset_index()
- 분기별 표현
- change to
datetime
- change
PeriodIndex
-
1 2 3 4 5 6 7 8 9 10
date quarter s1 3/22/13 2013q1 s2 3/24/13 2013q1 s1 6/21/13 2013q2 s2 6/26/13 2013q2 s1 9/21/13 2013q3 s2 9/28/13 2013q3 df.date = pd.to_datetime(df.date) df['quarter'] = pd.PeriodIndex(df.date, freq='Q')
- change to
Sort_values
- 정렬할 칼럼 값
- ascending = [False,True … ]
- False 오름 차순
1
df.sort_values(['dt','type','variable'],ascending=[True,True,False])