ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자주 쓰는 Pandas 코드
    pandas & duckdb 2024. 8. 13. 11:08

    데이터 통계 보기

    df.info()
    df.describe()
    
    df.describe(include='object') 
    df.value_counts()

     

    데이터 필터링

    df[['name', 'age']]
    df.loc[1]  # 두번째 row
    df.loc[df['a'] > 10, ['a', 'c']]   # Select rows meeting loglogical condition, and only the specific columns .
    
    df.sample(frac=0.5)
    df.sample(n=10)  # Randomly select n rows.

     

     

    1개의 Cell  읽어 DataFrame 이 아닌 원래 type 으로 리턴하기

    df.loc[0, "age"]
    web_doc_meta.loc[web_doc_meta['key'] == 'vTime', 'value'].to_numpy()[0]

     

    Column  타입 변경하기

     df["is_deleted"] = df["is_deleted"].astype(str)

     

    기존 데이터를 변환해 새로운 Column 으로 추가하기

    import pendulum
    
    
    df["visitTime"] = df["vTime"].apply(
            lambda ts: pendulum.from_timestamp(ts / 1000, tz="Asia/Seoul").format("YYYY-MM-DD HH:mm:ss.SSSZ")
        )

     

    duckdb UDF 사용하기 - 참고

    import pendulum
    import duckdb
    
    
    duckdb.create_function("convert_vtime", lambda ts: pendulum.from_timestamp(ts / 1000, tz="Asia/Seoul").format("YYYY-MM-DD HH:mm:ss.SSSZ")
    df = duckdb.sql("""select *, convert_time(vTime) as visitTime from df""").to_df()

     

    Plot

    df['cost'].plot(kind='hist', range=[0, 1000], xlabel='cost', ylabel='count', bins=30, grid=True)

     

    DataFrame 속성

    df.ndim
    df.shape
    df.columns
    df.dtypes
    df.values

     

     

     

    DataFrame 만들기

    import pandas as pd
    
    df = pd.DataFrame(
        data=[
            ("A", 10),
            ("B", 20)
        ],
        columns=["name", "age"]
    )
    
    print(df)
    
    #   name  age
    # 0    A   10
    # 1    B   20

     

    df = pd.DataFrame(
        {
            'name': ['A', 'B', 'C'],
            'age': [1, 2, 3],
            'children': [4, 5, 6]
        }
    )
    
    print(df)
    
    #   name  age  children
    # 0    A    1         4
    # 1    B    2         5
    # 2    C    3         6

     

     

    Row 추가 하기

    s = pd.Series([1, 2])
    s[5] = 8
    
    # 0 1
    # 1 2
    # 5 8
    
    
    df = pd.DataFrame(
        [[1, 2], [3, 4]],
        columns=["A", "B"]
    )
    
    df.loc[len(df)] = [5, 6]
    
    # 0 1,2
    # 1 3,4
    # 3 5,6

     

     

    GroupBy

    # 결과가 Series 로 출력됨
    df.groupby(["class", "who"])["fare"].count()
    
    # 결과가 DataFrame 으로 출력됨
    df.groupby(["class", "who"])[["fare"]].count()
    
    # fare 에 대한 count, mean
    # age 에 대한 count, mean 이 구해 짐
    x = df.groupby(["class", "who"])[["fare", "age"]].agg(["count", "mean"])
    
    # fare 에 대한 count 만 보려고 할 때 2가지 방법
    x["fare"]["count"]
    x[("fare", "count")]
    
    # 참고
    df.groupby(["class", "who"])[["fare", "age"]].agg(["count", "mean"]).reset_index(drop=True)

     

    출력시 Index 숨기기

    https://stackoverflow.com/a/57649212/5137193

    df.style.hide()

     

    CSV 저장시 Index 제외하기 & quoting

    • quoting 옵션이 csv.QUOTE_ALL로 설정되면 모든 값이 쌍따옴표로 감싸집니다.
    • 기본값은 csv.QUOTE_MINIMAL로, 필요한 경우에만 따옴표를 추가합니다.
    • sv.QUOTE_NONE을 사용할 경우, 데이터에 쉼표(,)가 포함되어 있으면 문제가 발생할 수 있습니다.
    df.to_csv("output.csv", sep='\t', index=False,  quoting=csv.QUOTE_NONE)

     

     

    timestamp 타입이 포함된 spark dataframe 을 pandas dataframe 변환시 오류 대응

    TypeError: Casting to unit-less dtype 'datetime64' is not supported. 
    Pass e.g. 'datetime64[ns]' instead.


    에러 원인

    • 스키마에서 timestamp 컬럼: modifyTime: timestamp (nullable = true)
    • df.limit(3).toPandas() 수행 시, PySpark가 내부적으로 pandas 타입으로 변환하면서 datetime64 타입 캐스팅을 시도

    timestamp 컬럼을 string 으로 변환해 사용

    spark_df2 = spark_df.withColumn("modifyTime_str", df["modifyTime"].cast("string")).drop("modifyTime")
    spark_df2.limit(3).toPandas()
     

    'pandas & duckdb' 카테고리의 다른 글

    DuckDB 에서 PostgreSQL 연결하기  (0) 2025.10.31
    DuckDB 에서 pyspark api 사용하기  (0) 2025.10.31
    Time Series 데이터를 시각화  (0) 2022.10.25
    데이터 전처리, 추가, 삭제, 변환  (0) 2022.10.08
    복사와 결측치  (0) 2022.10.08

    댓글

Designed by Tistory.