ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python/Pandas DataFrame에 대한 팁
    코딩/Python 2024. 5. 22. 12:50
    728x90

    Pandas DataFrame의 행을 삭제할 경우의 문제

    Dataframe의 행을 삭제한 후에도 인덱스는 변경되지 않고 그대로기 때문에 for문으로 루프를 하면 에러가 발생할 수 있다.

    그래서 행을 삭제한 후에는 reset_index()를 사용해서 인덱스를 새로 만들어야 한다.

    reset_index의 파라미터 중 drop은 기존 인덱스를 삭제하고(False이면 기존 인덱스를 새로운 컬럼으로 삽입), inplace는 수정된 dataframe을 반환한다.

    df.drop(1, axis='index', inplace=True)
    df.reset_index(drop=True, inplace=True)

    Python/Pandas DataFrame값 변경

    Pandas DataFrame을 순환하기 위해 iterrows()를 사용할 경우 애매한 상황이 벌어지기도 한다. 그것은 DataFrame의 값을 변경할 경우다. 어떤 경우에는 값변경이 이뤄지기도 하고 어떤 때는 안될 때가 있다.

    아래 코드에서 make_df1()으로 만든 DataFrame은 iterrows()를 사용해서 값을 변경할 수 있다. 하지만 make_df2()로 만든 것은 값이 변경되지 않는다.

    이런 현상은 iterrows()가 원본 view가 아닌 복사된 값을 반환하기 때문이라고 iterrows()는 설명하고 있지만 어떤 경우에는 가능하기도 하니 헷갈릴 수 있다.

     

    DataFrame의 값을 변경할 때는 항상 iloc[]이나 loc[]을 이용하고 iterrows() 대신 for i in range(len(df))의 형식을 사용한다.

    def make_df1():
        data = np.random.randint(0, 101, size=(5, 5))
    
        df = pd.DataFrame(data, columns=[f'Col_{i}' for i in range(5)])
    
        print(df)
        return df
    def make_df2():
        a = []
        for i in range(5):
            a.append(i+1)
    
        b = []
        for i in range(5):
            b.append((i+1)*10)
    
        c = []
        for i in range(5):
            c.append((i+1)*100)
    
        d = []
        for i in range(5):
            d.append((i+1)*1000)
    
        df = pd.DataFrame()
        df['a'] = a
        df['b'] = b
        df['c'] = c
        df['d'] = d
    
        print(df)
        return df
    # 잘못된 값 변경
    
    # df1은 값 변경 가능
    df1 = make_df1()
    print(df1)
    for _, row in df1.iterrows():
        row.iloc[0] = row.iloc[0] + 10
    print(df1)
    
    # df2는 값 변경 불가능
    df2 = make_df2()
    print(df2)
    for _, row in df2.iterrows():
        row.iloc[0] = row.iloc[0] + 10
    print(df2)
    # iloc[]을 사용한 올바른 값 변경
    df = make_df1()
    for i in range(len(df)):
        df.iloc[i, 0] = df.iloc[i, 0] + 10
    728x90

    댓글

Designed by Tistory.