랭귀지/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)