파이썬 판다스 팁 (Python Pandas Tips and Methods)

3 minute read

실무에서 정말 자주 사용하는 pandas 기능들.

csv파일 읽기

import pandas as pd

df = pd.read_csv('파일경로/파일명.csv')

df 생성하기

df = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]],
                columns = ['a', 'b', 'c'],
                index = ['A', 'B'])

data 구조 살피기

df.head()
df.tail()
df.info()  #cardinality, dtype 확인 (df.dtypes 로도 확인 가능)
df.describe()  #non-object type 변수들의 간단한 통계
df.describe(include = "O")  #object type 변수들의 간단한 통계
df.shape  #행, 열 개수
df.size  #데이터 개수 5x2 이면 10
df.columns

간단한 통계 내기

len(df)  #행 개수
df.count()  #null 제외한 행 개수
df.sum()
df.mean()
df.std()
df.min()
df.max()
len(df.columns)  #열 개수
pd.unique(df['colA'])  #colA를 unique한 값만 가져오기
len(pd.unique(df['colA']))  #colA의 unique한 값의 개수 세기
df['colA'].value_counts(normalize=False, sort=True, ascending=False, dropna=True, bins=None)  #colA를 구성하는 값들이 총 몇 번 출현하는지 빈도 세기

특정 열을 기준으로 그룹화 하기

df.groupby('colA').mean()
df.groupby(['colA', 'colB']).mean()

# colA의 값을 기준으로 colB의 값을 그룹화하여 list로 만듦
df.groupby('colA')['colB'].apply(list)

# colB, colC, colD의 값을 각각 다른 조건으로 그룹화
df.groupby('colA').agg({'colB':'sum' ,'colC':'count'}) 
df.groupby('colA').agg({'colB':'count', 'colC':lambda row: ', '.join(row)}) 

data 타입 변경

df.astype('float') #df 전체 변경
df.astype({'columnA':'object'}) #특정 열만 변경
pd.to_numeric(df['colA'])

슬라이싱

df.iloc[1, 1]  #index로 찾기
df.iloc[34:39, [0, 2, 5, 7]]  #범위로 선택하거나, []안에 넣어 여러개를 선택
df.loc['indexA', 'columnA']  #값으로 찾기
df.loc[:, ['columnA', 'columnB']]  #행, 열 전체를 선택할 때는 :

rows = list(range(5)) + [35, 36]
df.iloc[rows]

cols = df.columns[:3].to_list() + ["columnA", "columnB"]
df.loc[:, cols]

필터링

df.loc[df['colA'] == 'A']  #colA 값이 A인 행만 보기
df.loc[(df['colA'] == 'A') & (df['colB'] == 'B')]  #colA 값이 A이고 colB 값이 B인 행만 보기 (or 조건일 때는 | 사용)
df.loc[df['colA'].str.contains('apple')]  #colA 값이 apple을 포함하는 행만 보기
df.loc[df['colA'].str.startswith('A')]  #colA 값이 A로 시작하는 행만 보기
df.loc[df['colA'].str.isnumber()]  #colA 값을 구성하는 string이 모두 숫자인 행만 보기, 예. "093482"
df.loc[df['colA'].isin(['A', 'B', 'C']]  #colA 값이 A~C인 행만 보기

행,열 삭제하기

#행 삭제
df.drop(df.index[1:2], axis=0, inplace=True)

#열 삭제
df.drop(['columnA', 'columnB'], axis=1, inplace=True)
del df['columnA']

#특정 조건으로 필터링해서 행 삭제
index = df[df['columnA'==0 | 'columnB' > 3]].index  # &나 |로 연결
df.drop(index, inplace=True)

#중복되는 행 삭제
df.drop_duplicates(inplace=True, ignore_index=True)  #ignore_index를 True로 하면 index를 0부터 리셋해줌

행,열 추가하기

#열 추가
df['newColumn'] = 0
df.loc[:,'newColumn'] = ['val1','val2','val3', ...]

#행 추가
new_row = {'columnA':3, 'columnB':5}
df.append(new_row, ignore_index=True)

#행 순서 변경
df = df[['columnB', 'columnA']]  #A,B 순서였던 것을 B,A로 변경

missing value 처리

df.isnull().sum()  #missing value가 몇 개인지 알아보기
df[df['colA'].isnull()]  #colA에 missing value가 있는 행만 가져오기

df.dropna(axis=0, inplace=True)  #행을 삭제
df.dropna(axis=1, inplace=True)  #열을 삭제
df.dropna(axis=1, how='all', inplace=True)  #열의 모든 값이 na일 때 그 열을 삭제

df.fillna(0, inplace=True, downcast='infer')  #downcast='infer'는 float를 int로 변경
df.fillna(method='ffill')  #value 없이 method=ffill이면 바로 윗행의 값을 가져옴
df.ffill()  #위와 같은 기능

행,열 이름 변경

df.rename(columns = {'A':'B'}, index = {'C':'D'})  #A는 B로 바꾸고 C는 D로 바꿈
df.reset_index(drop = True, inplace=True)  #행의 index를 0,1,2,... 순서대로 다시 매김
df.set_index('columnA', inplace=True)  #행의 index를 columnA의 값으로 바꿈

행,열 합치기

#데이터프레임 합치기 (위아래로)
pd.concat(list)
pd.concat([df1, df2])

#데이터프레임 합치기 (옆으로)
df.merge(df1, how = 'left', on = 'fullVisitorId')

Lambda 함수로 열의 값을 합치거나 나누기

#열 합치기
def mergeCols(a, b):
    return str(a) + "," + str(b)
df['AB'] = df.apply(lambda x: mergeCols(x['A'], x['B']), axis = 1)

#열 나누기
def splitCols(row):
    return row.split(',')
df = df.merge(df['AB'].apply(lambda x: pd.Series({'A':splitCols(x)[0], 'B':splitCols(x)[1]})), 
    left_index = True, right_index = True)  #join key로 양쪽의 index를 사용
del df['AB']  #원본 열은 삭제

값 정렬하기

df.sort_values(by = ['colA','colB'], axis = 0, ascending = True, inplace = True)
df.sort_index(axis = 0, ascending = True, inplace = True)

값 변경하기

df.loc[df['colA'] == 'A'] = 'AB'  #colA의 값 중 A를 AB로 변경
df['colA'] = df['colA'].apply(lambda x: 1 if x=='A' else 0)  #colA의 값이 A면 1로 바꾸고 아니면 0으로 바꿈
df['colA'] = df['colA'].apply(lambda x: 'alpha' if x=='A' else 'beta' if x=='B' else x)  #colA의 값이 A면 alpha로 바꾸고 B면 beta로 그외는 그냥 유지

Index 변경

df.set_index('colA')  #index를 colA로 변경
df.reset_index()  #index를 0부터 순서대로 다시 매겨줌 (일부 행을 drop시킨 뒤 종종 사용)

기타 세팅값

pd.set_option('display.max_row', 100)  #행을 최대 100개까지 표시
pd.set_option('display.max_columns', 100)  #열을 최대 100개까지 

Categories:

Updated: