아미(아름다운미소)

pd.concat 을 사용할 때 컬럼이 서로 맞지 않는 경우, list_columns 에 지정된 컬럼명으로 맞춘 후 병합 본문

랭귀지/pandas

pd.concat 을 사용할 때 컬럼이 서로 맞지 않는 경우, list_columns 에 지정된 컬럼명으로 맞춘 후 병합

유키공 2025. 3. 25. 08:38

극한의 성능 필요시

# 리스트 컴프리헨션 + 딕셔너리 생성
def fast_concat(df_list, target_cols):
    return pd.DataFrame(
        {col: pd.concat([df[col] for df in df_list if col in df], 
                       ignore_index=True) 
         for col in target_cols}
    )

final_result = fast_concat([df1, df2], list_columns)

### 방법 1: `reindex` 사용

import pandas as pd

# 예시 데이터프레임들
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'C': [5, 6], 'D': [7, 8]})

# 원하는 컬럼 순서/목록
list_columns = ['A', 'B', 'C', 'D']

# 각 데이터프레임을 list_columns로 재인덱싱 후 concat
df1_aligned = df1.reindex(columns=df1.columns.intersection(list_columns))
df2_aligned = df2.reindex(columns=df2.columns.intersection(list_columns))

result = pd.concat([df1_aligned, df2_aligned], ignore_index=True)

### 방법 2: `union` 사용 후 정렬

# 모든 컬럼의 합집합을 구한 후 정렬
all_columns = pd.Index(list_columns)
df1_aligned = df1.reindex(columns=all_columns.intersection(df1.columns))
df2_aligned = df2.reindex(columns=all_columns.intersection(df2.columns))

result = pd.concat([df1_aligned, df2_aligned], ignore_index=True)

### 방법 3: 누락된 컬럼 추가 후 `concat`

def align_columns(df, target_columns):
    # 존재하지 않는 컬럼은 NaN으로 채워서 추가
    for col in target_columns:
        if col not in df.columns:
            df[col] = pd.NA
    # 컬럼 순서 정렬
    return df[target_columns]

# list_columns 순서대로 정렬
result = pd.concat([
    align_columns(df1, list_columns),
    align_columns(df2, list_columns)
], ignore_index=True)

컬럼 순서까지 보정

# 1. list_columns 순서 우선 + 없는 컬럼은 NaN으로 채우기 (추천)
result = pd.concat([
    df1.reindex(columns=list_columns),
    df2.reindex(columns=list_columns)
], ignore_index=True)

# 2. 교집합만保留 + 순서 보장 (필요시)
result = pd.concat([
    df1[[col for col in list_columns if col in df1.columns]],
    df2[[col for col in list_columns if col in df2.columns]]
], ignore_index=True).reindex(columns=list_columns)
Comments