Pandas 기초 syntax
Pandas Data Type (dtype)
파이썬의 데이터 타입과는 다른 pandas의 data type.
-
object
: string -
int64
: int -
float64
: float -
bool
: boolean -
datetime64
: 날짜/시간 -
timedelta[ns]
: 두 datatime64 간의 차
Pandas Series & Dataframe
- series: 하나의 column
- dataframe: table 형태, 여러개의 series
- column name이 결국 열의 index
- df의 특정 column의 data type은 series
Pandas 데이터프레임 읽기
- 구분자는 보통 comma이지만 특수한 경우 데이터에 맞게 지정
- 에러나는 데이터는 보통 제외하고 로드
# csv
doc = pd.read_csv("file_name", encoding='utf-8-sig', quotechar=',', error_bad_lines=False)
# excel (특정 sheet 로드시)
doc = pd.read_excel("file_name", sheet_name="sheet_name")
Pandas 데이터프레임 기본 syntax
df = pd.DataFrame({
"미국": [2.1, 2.2, 2.3],
"한국": [0.4, 0.5, 0.45],
"중국": [10, 13, 15]},
index = [2000, 2010, 2020]
)
df.columns # Index(['미국', '한국', '중국'], dtype='object')
df.values # array([[ 2.1 , 0.4 , 10. ],
# [ 2.2 , 0.5 , 13. ],
# [ 2.3 , 0.45, 15. ]])
# index
df = df.set_index('년도') # 인덱스 이름을 년도로 설정
df.index.name = '연도' # 연도로 수정
df.index.name # '연도'
df = df.reset_index('연도') # 인덱스를 컬럼으로 변경
df = df.set_index('연도') # 다시 인덱스로 설정
# 특정 열 찾기
df.loc[2000] # column name으로 열 찾기
df.iloc[0] # column index로 열 찾기
# column 추가
df['일본'] = [1, 2, 3]
# column 삭제
del df['일본']
# row 삭제
df.drop([2020]) # row 삭제
# 필요한 column만 추출
df2 = df[['중국', '한국']]
df2 = df[['중국', '한국']].copy() # 필요한 컬럼만 새 데이터프레임으로 복사
# 필요한 row 추출
doc_us = doc[doc['Country_Region'] == 'US']
Series 관련 syntax
countries = doc['Country_Region'] # 해당 column series만 추출
countries.size # 사이즈
countries.count() # 데이터 없는 경우 제외한 사이즈
countries.unique() # 유일한 값 리턴
countries.value_counts() # 데이터가 없는 경우 제외한 각 값의 개수
결측치 처리
doc.isnull().sum() # 각 column의 결측치의 개수
doc = doc.dropna() # 하나라도 결측치가 있으면 해당 row 삭제
doc = doc.dropna(subset=['Confirmed']) # 해당 col에 결측치가 있으면 해당 row 삭제
doc = doc.fillna(0) # 0으로 결측치를 대체
nan_data = {'Confirmed': 0, 'Recovered': 0}
doc = doc.fillna(nan_data) # 위에서 지정한 col에 대해 지정한 value로 결측치 대체
특정 키로 데이터 합치기
-
groupby()
: 문자열 value를 갖는 row는 없어짐
doc = doc.groupby('Country_Region').sum() # 같은 키값을 갖는 항목들의 데이터를 합쳐줌
doc = doc.groupby('Country_Region').mean() # 같은 키값을 갖는 항목들의 평균으로 합침
doc.index # groupby()의 기준이 된 key로 index가 변경됨
컬럼 타입 변경
doc = doc[['Country/Region', 'Confirmed']] # 필요한 컬럼만 선택하기
doc = doc.dropna(subset=['Confirmed']) # 특정 컬럼에 없는 데이터 삭제하기
doc = doc.astype({'Confirmed': 'int64'}) # 특정 컬럼의 데이터 타입 변경하기
컬럼 이름 변경
doc = doc[['Country/Region', 'Confirmed']]
doc.columns = ['Country_Region', 'Confirmed']
# 중간에 컬럼명이 바뀌는 경우 -> try except 구문 활용
try:
doc = doc[['Province_State', 'Country_Region', 'Confirmed']]
except:
doc = doc[['Province/State', 'Country/Region', 'Confirmed']]
doc.columns = ['Province_State', 'Country_Region', 'Confirmed']
데이터프레임 중복 행 제거
doc.duplicated() # 해당 행이 중복행인지 boolean type으로 리턴
doc[doc.duplicated()] # 중복된 행만 확인
# 특정 행 기준 중복 제거
# 처음 or 마지막 행 중 어느 것을 남길지: keep = 'first'(defult) or 'last'
doc = doc.drop_duplicates(subset='Country_Region', keep='last')
데이터프레임 합치기
-
concat
: 단순히 위아래/좌우로 붙이는 것-
axis
: 0 (위아래) or 1 (좌우)
-
pd.concat([df1, df2]) # axis=0(default): 위아래로 합침
doc = pd.concat([df1, df2], axis=1) # axis=1: 좌우로 합침
-
merge
: 동일한 이름의 컬럼을 기준으로 합침 (SQL의 JOIN)-
on
: 기준 컬럼명 명시 e.g.) id -
how
: 결합 방법 (SQL과 동일)- inner: 내부 조인 (default)
- 기준 컬럼 값이 동일한 row를 찾고, 해당 row만 가져오기
- 기준 컬럼 값이 동일하지 않은 것은 제거
- outer: 외부 조인
- 기준 컬럼 값이 동일하지 않아도 다 가져오고, 데이터가 없는 값은
Nan
- 기준 컬럼 값이 동일하지 않아도 다 가져오고, 데이터가 없는 값은
- left: 왼쪽 우선 외부 조인
- 왼쪽 데이터프레임의 행을 다 가져옴
- 오른쪽에서는 기준 컬럼 값이 동일한 row만 가져오고, 데이터가 없는 값은
Nan
- right: 오른 쪽 우선 외부 조인
- 오른쪽 데이터프레임의 행을 다 가져옴
- 왼쪽에서는 기준 컬럼 값이 동일한 row만 가져오고, 데이터가 없는 값은
Nan
- inner: 내부 조인 (default)
- index를 기준 컬럼으로 할 수도 있음
-
pd.merge(df1, df2) # 기준 컬럼을 명시하지 않아도 동일한 이름의 컬럼을 기준으로 병함함
pd.merge(df1, df2, on='id') # 기준 컬럼 명시
pd.merge(df1, df2, on='id', how='outer') # 결합 방법 명시
# index를 기준으로 병합하기
df1 = df1.set_index('id') # id column을 index로 설정
df2 = df2.set_index('id')
pd.merge(df1, df2, how='outer', left_index=True, right_index=True)
apply 함수
-
df.apply(func, axis=0)
-
func
: 값에 적용하고자 하는 function -
axis
: 0은 coulmn에 해당 함수 적용, 1은 row에 적용
-
# col A 값에 2를 더한 새로운 column B 생성 (series)
df['B'] = df['A'].apply(lambda x: x + 2)
# col A 값 + col B 값 = 새로운 column C 생성 (dataframe)
df['C'] = df.apply(lambda x: x.A + x.B, axis=1)
df = pd.DataFrame({
'영어': [60, 70],
'수학': [100, 50]
}, index = ['Dave', 'David'])
# 함수로 custom function 정의
def func(df_data):
df_data['영어'] = 80
return df_data
# row에 적용하므로 axis=1
df_func = df.apply(func, axis=1)