pandas는 데이터 전처리 및 분석에 있어서 핵심적으로 사용되는 python 라이브러리다. pandas.Series는 1차원 형태로 데이터를 저장하고, pandas.DataFrame은 Series들을 하나의 열로 취급한 집합이다. 2차원 테이블 형태로 데이터를 저장한다. 아래와 같이 DataFrame과 같이 사용한 함수들을 정리하였다.
아래와 같은 방법으로 dataframe 내의 데이터를 접근할 수 있다.
# select first row
df.iloc[0]
# select first column
df.iloc[:, 0]
# select first row, second column
df.iloc[0, 1]
# select Name column where index is one
df.loc['one', 'Name']
특정 조건으로 dataframe을 filtering 할 수 있다.
# select Email column where Name is Antonio
df[df['Name'] == 'Antonio', 'Email']
# select Email and Name where Age is more than 50
df[df['Age'] > 50][['Name', 'Email']]
# set IsAlone column zero where FamilySize is 1
df.loc[df['FamilySize'] == 1, 'IsAlone'] = 0
# return a series whether value of df.age is (or not) in customer_age_list
df.age.isin(customer_age_list)
# return negative of above series
~df.age.isin(customer_age_list)
# return a dataframe whether value of df.age is in customer_age_list
df[df.age.isin(customer_age_list)]
SQL에서 사용하던 함수들과 유사한 함수들도 DataFrame에서 사용할 수 있다. RDB에서 테이블에 SQL로 쿼리 하던 수준의 기능들이 DataFrame에도 구현되어 있다.
# sort dataframe in ascending order by Name, Age
df = df.sort_values(by=['Name', 'Age'], ascending=True)
# show count by column
df.count()
# show count by value in Age column (series)
df['Age'].value_counts()
# show mean value of Age column
df[['Age']].mean()
# select sum of Fare group by Age
df.grouby(by='Age')[['Fare']].sum()
# select max min of Age group by Class
df.groupby(by='Class')['Age'].agg([max, min])
DataFrame에 특정 컬럼을 추가하거나, 특정 컬럼을 삭제할 수 있다.
# return new dataframe which Age column is dropped
df.drop(['Age'], axis='columns')
# add New column of zeros
df['New'] = [0 for i in range(len(df))]
df['New'] = 0
# Add Age_doubled column that is twice the value of Age column.
df['Age_doubled'] = df['Age'] * 2
마치 SQL의 join처럼 두 dataframe을 join할 때 merge
를 사용한다.
df1 = pd.DataFrame({'name': ['Tom', 'Billy', 'Sally', 'Irene'],
'age': [24, 13, 56, 12],
'id': ['ab', 'bc', 'cd', 'de']})
# name age id
# 0 Tom 24 ab
# 1 Billy 13 bc
# 2 Sally 56 cd
# 3 Irene 12 de
df2 = pd.DataFrame({'name': ['Tom', 'Billy', 'Parker', 'Peter'],
'phone': ['010-1234-5677', '010-1213-1434', '011-2424-4284', '010-4492-8294'],
'score': [87, 56, 100, 13]})
# name phone score
# 0 Tom 010-1234-5677 87
# 1 Billy 010-1213-1434 56
# 2 Parker 011-2424-4284 100
# 3 Peter 010-4492-8294 13
# inner join on name (intersection)
pd.merge(df1, df2, how='inner', on='name')
# name age id phone score
# 0 Tom 24 ab 010-1234-5677 87
# 1 Billy 13 bc 010-1213-1434 56
# outer join on name (union)
pd.merge(df1, df2, how='outer', on='name')
# name age id phone score
# 0 Tom 24.0 ab 010-1234-5677 87.0
# 1 Billy 13.0 bc 010-1213-1434 56.0
# 2 Sally 56.0 cd NaN NaN
# 3 Irene 12.0 de NaN NaN
# 4 Parker NaN NaN 011-2424-4284 100.0
# 5 Peter NaN NaN 010-4492-8294 13.0
# left join on name
pd.merge(df1, df2, how='left', on='name')
# name age id phone score
# 0 Tom 24 ab 010-1234-5677 87.0
# 1 Billy 13 bc 010-1213-1434 56.0
# 2 Sally 56 cd NaN NaN
# 3 Irene 12 de NaN NaN
# show merge information
pd.merge(df1, df2, how='outer', on='name', indicator=True)
# name age id phone score _merge
# 0 Tom 24.0 ab 010-1234-5677 87.0 both
# 1 Billy 13.0 bc 010-1213-1434 56.0 both
# 2 Sally 56.0 cd NaN NaN left_only
# 3 Irene 12.0 de NaN NaN left_only
# 4 Parker NaN NaN 011-2424-4284 100.0 right_only
# 5 Peter NaN NaN 010-4492-8294 13.0 right_only