pandas 이용해서 데이터 분석, 전처리 진행하면서 답답함을 느껴
Polars 라이브러리 공부하면서 작업을 진행한 문법들을 Pandas 와 비교하며 정리해보겠습니다.
Polars 라이브러리 특징
1. Index 존재하지 않음.
- pandas에서 이용하는 index 사용하는 문법 사용 불가 ex) iloc, set_index, reset_index
2. 절대적인 컬럼 타입의 통일
- 파일 read 시 컬럼내 여러 타입의 Value 존재시 바로 read 할 수 없음
3. df.col_name 과 같은 도트 연산자 사용 불가
- 항상 df["col_name"] 같은 방법으로 접근해야함
Polars VS Pandas 문법 비교
제가 이용한 Polars 버전은 0.18.15 입니다. (pandas 1.4.1)
(최신 버전 설치 권장, 낮은 버전에서는 사용 못하는 문법이 많은 듯 합니다.)
import pandas as pd
import polars as pl
1. 파일 Read, Write
# read
# pandas
df = pd.read_csv("data")
df = pd.read_parquet("data")
# polars
df = pl.read_csv("data")
df = pl.read_parquet("data")
# write
# pandas
df.to_csv(data, index=False) # 저는 저장할때 보통 인덱스를 제거합니다.
df.to_paruqet(data, index=False)
# polars
df.write_csv(data)
df.write_parquet(data)
2. 데이터프레임(pandas) to 데이터프레임(polars), 데이터프레임(polars) to 데이터프레임(pandas)
# pandas to polars
df = pl.from_pandas(df)
# polars to pandas
df = df.to_pandas()
3. drop_duplicates
# pandas
df.drop_duplicates(subset=["col_name1", "col_name2"])
# polars
df.unique(subset=["col_name1", "col_name2"])
3. drop column
# pandas
df.drop(columns=["col_name"])
df.drop(columns=["col_name"], inplace=True)
del df["col_name"]
# polars
df.drop("col_name")
df.drop_in_place("col_name")
# del df["col_name"] 사용불가
4. concat
# pandas
df = pd.concat([df_1, df_2])
# polars
df = pl.concat([df_1, df_2])
5. dropna
# pandas
df.dropna()
df.dropna(subset=["col_name"])
# polars
df.drop_nulls()
df.drop_nulls(subset=["col_name"])
6. 조건문
# pandas
df[df["col_name"]>0]
# polars
df.filter(pl.col("col_name")>0)
7. apply 연산
# pandas
df["col_name"] = df["col_name"].apply(lambda x: x)
df["new_col_name"] = df["col_name"].apply(lambda x: x)
# polars
df = df.with_columns(pl.col("col_name").apply(lambda x: x))
df = df.with_columns(pl.col("col_name").apply(lambda x: x).alias("new_col_name"))
8. 타입 캐스팅
# pandas
df["col_name"] = df["col_name"].astype(int)
# polars
df = df.with_columns(pl.col("col_name").cast(pl.Int64))
"""
pl.Int64
pl.Int32
pl.Float64
pl.Float32
pl.Utf8
등이 있음
"""
9. 인덱스 컬럼 생성 (polars 만)
df = df.with_columns(pl.arange(len(df), eager=True).alias("index"))
# arange 매개변수로 eager=True 는 즉시 Series를 리턴한다는 의미
# 주의
df = df.with_row_count(name="index", offset=0)
"""
with_row_count 문법으로 간단하게 생성할 수 있지만 인덱스 번호가
offset=10**10 자리 넘어가면 오류를 뱉어내거나 잘못된 번호부터 인덱싱함
아직 불안전한 문법인 것 같습니다.
디폴트로 offset=0 입니다.
"""
10. join
# pandas
df = df1.join(df2, on=["col_name"], how="left")
df = pd.merge(df1,df2, on=["col_name"], how="left")
# polars
df = df1.join(df2, on=["col_name"], how="left")
# polars 는 merge 문법 없음
11. DataFrame에서 dict 만들기
# pandas
df = pd.DataFrame({"col_name_1":["one","two","three"],"col_name_2":[1,2,3]})
pd_dict = df.set_index("col_name_1")["col_name_2"].to_dict()
pd_dict
>> {"one":1, "two":2, "three":3}
# polars
df = pl.DataFrame({"col_name_1":["one","two","three"],"col_name_2":[1,2,3]})
pl_dict = dict(df[["col_name_1","col_name_2"]].iter_rows())
pl_dict
>> {"one":1, "two":2, "three":3}
# 사실 문법 자체가 다르지만, polars로 이것이 최선이었습니다.
# 더 좋은 문법 찾게되면 수정하겠습니다!
12. rename
# pandas
df.rename(columns={"col_name":"new_col_name"})
# poalrs
df.rename({"col_name":"new_col_name"})
# 개인적으로 제일 만족한 문법입니다
# pandas에서는 columns 쓰는걸 강제해서 문장만 길어지고 개인적으로 불필요하다고 느껴서..
13. nan count
# pandas
df.isna().sum()
# polars
df.null_count()
간단한 사용기 말씀드리면 pandas는 matplotlib 라이브러리 호환성 때문에 시각화 용도로만 사용할 것 같습니다.
이외에는 모두 polars 처리할 것 같습니다. 만약, 이글을 읽으시는 누군가 여러 파일을 리스트에 담아
concat 해야하는 상황이 온다면 꼭! 속도 체감해보시길 강추드립니다!!
아직 정리 못한 문법이 많지만 추후 2탄으로 찾아뵙겠습니다!! :)
'python' 카테고리의 다른 글
벡터와 벡터 유사성측정 (0) | 2022.05.14 |
---|---|
[통계학] 3. 공분산과 상관계수 및 시각화 (0) | 2022.05.14 |
[통계학] 4. 확률 및 통계 (0) | 2022.05.14 |
[통계학] 1. 산포도 (분산, 표준편차, 사분위) (0) | 2022.05.11 |
[통계학] 0. 대표값(평균값, 중앙값, 최빈값) (0) | 2022.05.11 |