Convert
DataFrame 을 list of dictionary 로 변경
df.to_dict('records')records 값은 특정 column 값이 아니다. 그냥 붙이는 것.
Notation
Scientific Notation -> Floating Notation
df.describe().apply(lambda s: s.apply('{0:.5f}'.format))
Cleaning
특정 조건을 만족하는 행 지우기
df.drop(df[<condition>].index, inplace=True)
예시) column vimp 값이 0 인 행 지우기: df.drop(df[df['vimps'] == 0].index)
String
- column
A값에 특정 string 값 (hello) 가 포함되있는지 확인하기df[df['A'].str.contains("hello")]
- string cleaning
- 영어 문장에 포함되어 있는 punctuation 및 whitespace 등을 제거하는 방법: stackoverflow
- 영어 문장에 포함되어 있는 숫자 제거하기:
df.text.str.replace(r'\d+', '', regex=True)regex를 명시해야만 warning 이 뜨지 않음
Plotting
Scientific Notation 지우기
plt.ticklabel_format(style='plain', axis='y')Indexing
특정 조건을 만족하는 row 만 불러오기 (stackoverflow)
df.loc[df['column_name'].isin(some_values)]Query
아래와 같이 query 함수를 활용하여 인덱싱이 가능하다.
min_year = 1980
min_time = 10
df = df.query('Year < 1980 and Time > 10')
df = df.query('Year < @min_year and Time > @min_time') Groupby
groupby는 특정 key 단위로 DataFrame을 묶은 뒤 aggregation을 수행할 때 쓴다.
nunique
그룹별 고유값 개수를 보고 싶을 때는 nunique를 쓴다.
df.groupby("Countries")["code"].nunique()unique
고유값의 개수가 아니라 값 자체를 보고 싶다면 unique를 쓴다.
df.groupby("Countries")["code"].unique()map
Series.map은 값 변환에 자주 쓴다. dictionary를 넘기면 key와 같은 값을 value로 바꾼다.
s.map({"cat": "kitten", "dog": "puppy"})mapping에 없는 값은 NaN이 될 수 있으므로, 원래 값을 보존해야 한다면 fillna나 replace와 함께 쓰는 편이 안전하다.
Large Dataset 다루기
References: link
가장 쉬운 방법은 pandas 를 쓰지 않는 것이다. 일반적으로 PostgreSQL 과 같은 대용량 데이터 도구를 사용하는 것이 훨씬 효율적이다.
CSV 읽기
pandas.read_csv() 에서 usecols 옵션을 통해 원하는 column 만 읽어와서 메모리를 절약할 수 있다.
Parquet 을 사용한 로딩 속도 감축
csv 파일을 hadoop/Apache Parquet 포맷으로 저장하고 다시 불러오면 훨씬 속도가 빠르다. 다만 용량은 어떤지 직접 확인해야 한다.
How?
pd.read_csv 로 불러온 뒤에 to_parquet 으로 저장, 그리고 read_parquet 수행
데이터 타입 바꾸기
DataFrame.memory_usage(deep=True) 를 통해 각 column 의 메모리 사용량을 bytes 로 확인할 수 있다. 만약 특정 column 이 너무 많은 메모리를 사용한다면, dtype 을 바꾸는게 좋은 전략이다.
object타입 데이터를Categorical타입으로 바꿀 수 있다면 메모리가 매우 절약된다.pandas.to_numeric()함수에downcast인자를 적절히 넣어주면, 필요한 수준의dtype을 사용할 수 있다 (e.g.int64->uint16).
Chunking 사용하기
csv 파일들이 저장되어있는 전체 폴더를 parquet 으로 바꿀 수 있지만, 이를 좀 더 단순화 시켜서 개별 csv 파일들을 각각 parquet 으로 바꿀 수 있다. 변환된 각 chunk(i.e. parquet) 들이 메모리에 들어가는 한, 전체 시스템 메모리보다 더 많은 용량에 대한 작업을 수행할 수 있다.
예시
- 모든 csv 파일들을 parquet 형식으로 바꾼다.
- 각 parquet 을 읽어가면서 divide-and-conquer 방식으로 필요한 작업을 수행한다.
groupby 와 같은 메소드는 chunkwise 방식과는 어울리지 않는다. 이런 경우, 그냥 pySpark 를 쓰는게 빠를 것 같다.
다른 Library 사용하기
Dask 가 괜찮다.