Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- 맛집
- urllib
- 다이어트
- PyQt5
- ASP
- mssql
- GIT
- Linux
- PER
- sqlite
- Unity
- swift
- 유니티
- IOS
- Excel
- 날짜
- 함수
- python
- tensorflow
- MySQL
- node.js
- javascript
- ubuntu
- 리눅스
- PyQt
- pandas
- port
- flutter
- MS-SQL
- 라즈베리파이
Archives
아미(아름다운미소)
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)
'랭귀지 > pandas' 카테고리의 다른 글
merge (0) | 2025.03.26 |
---|---|
fillna 최종 (0) | 2025.03.25 |
@ 기준으로 앞의 값을 가져오고 @가 없으면 기존 값을 유지 (0) | 2025.03.20 |
-숫자 형태의 부분을 찾아 그 숫자를 추출 (0) | 2025.03.19 |
pandas의 str.split(expand=True)를 사용한 방법 (0) | 2025.03.17 |
Comments