아래 포스팅에서는 첨부된 선거결과 엑셀파일에 기록된 선거구별 투표자료를 체계적으로 재구조화하는 방법에 대해 자세히 설명합니다. 이 파일은 다소 복잡한 구조를 가지고 있는데,
- **B열의 “결과보기”** 셀을 기준으로 각 선거구 데이터 블록이 시작되고,
- “결과보기” 바로 다음 행에 해당 선거구명이 기록되며,
- 각 블록의 **7번째 아랫줄부터** 선거 관련 데이터(투표수치)가 나타납니다.
또한, 데이터 중 **“합계”, “거소·선상투표”, “관외사전투표”, “국외부재자투표”** 항목은 그대로 복사해야 하며, 그 아래에 있는 각 읍면동별 소계와 관내사전투표 수치는 별도로 재정리해야 하는 상황입니다.
아래에서 Python과 Pandas를 활용한 예제 코드와 함께 단계별 접근 방법을 소개합니다.

## 1. 데이터 구조 파악하기
먼저 파일의 구조를 이해하는 것이 중요합니다.
- **마커 “결과보기”**
– B열에 “결과보기”라는 텍스트가 나타나는 행을 찾습니다.
– 이 행의 바로 다음 행에는 해당 선거구의 이름이 기록되어 있습니다.
- **선거데이터의 시작 위치**
– 각 선거구 데이터 블록 내에서 하단으로부터 7번째 행부터 투표 관련 데이터(예를 들어 후보별 득표수, 각 투표 방식별 수치 등)가 등장합니다.
- **데이터 분류**
– 상단에 요약 데이터(“합계”, “거소·선상투표”, “관외사전투표”, “국외부재자투표”)가 위치할 경우 이들은 그대로 옮기며,
– 이들 아래에 있는 각 읍면동별 소계 및 관내사전투표 수치는 재구조화하여 보다 보기 쉽게 정리할 필요가 있습니다.
이러한 구조를 바탕으로 데이터를 “블록 단위”로 분리한 후, 각 블록 내에서 요약 부분과 세부 내역 부분으로 나누어 처리하는 방식으로 접근할 수 있습니다.
---
## 2. Python과 Pandas로 데이터 읽기
먼저 pandas 라이브러리를 이용해 엑셀 파일을 불러옵니다.
(엑셀 파일에는 헤더가 따로 없다고 가정하여 header=None 옵션을 사용합니다.)
```python
import pandas as pd
# 파일 경로 설정
file_path = '/mnt/data/지역구.xlsx'
df = pd.read_excel(file_path, header=None)
```
이렇게 하면 전체 데이터가 DataFrame 형태로 읽혀지며, 각 셀의 인덱스(행과 열 번호)를 기준으로 접근할 수 있습니다.
---
## 3. “결과보기” 마커를 기준으로 블록 분리하기
파일 전체에서 B열(인덱스 1)에 “결과보기”라는 텍스트가 있는 행을 모두 찾아 각 선거구의 데이터 블록으로 분리합니다.
예제 코드에서는 “결과보기” 행을 찾은 후, 해당 행 다음의 행에서 선거구명을 추출하고, 다음 “결과보기” 행 전까지의 데이터를 한 블록으로 저장합니다.
```python
# '결과보기'가 있는 행의 인덱스를 리스트로 찾기
marker_indices = df[df[1] == '결과보기'].index.tolist()
# 각 블록을 저장할 리스트
blocks = []
for i, marker in enumerate(marker_indices):
# '결과보기' 바로 다음 행이 선거구명이라고 가정
district_name = df.iloc[marker+1, 1]
# 현재 marker부터 다음 marker 전까지의 범위를 블록으로 설정
if i < len(marker_indices) - 1:
next_marker = marker_indices[i+1]
else:
next_marker = len(df)
block = df.loc[marker:next_marker-1].copy()
block['district'] = district_name # 각 블록에 선거구명을 추가
blocks.append(block)
```
> **주의:**
> 실제 파일 구조에 따라 “결과보기” 마커의 위치나 블록의 범위가 달라질 수 있으므로, 블록의 경계를 확인하고 필요한 경우 인덱스 조정을 하세요.
---
## 4. 각 블록 내에서 요약 데이터와 세부 데이터를 구분하기
각 블록의 하단 부분, 즉 **7번째 아랫줄부터** 시작하는 부분에 투표 데이터가 기록되어 있다고 설명되어 있습니다.
여기서는 아래와 같이 진행할 수 있습니다.
1. **요약 데이터 추출:**
– “합계”, “거소·선상투표”, “관외사전투표”, “국외부재자투표” 항목이 포함된 행은 그대로 추출합니다.
2. **세부 데이터 재구성:**
– 요약 데이터 이후(또는 요약 데이터와 구분되는 영역)에 각 읍면동별 소계와 관내사전투표 수치가 있으므로, 이 부분은 별도로 추출하여 원하는 형식(예: 읍면동 이름과 해당 투표수치 등)으로 재구조화합니다.
예제 코드는 다음과 같습니다.
```python
processed_blocks = []
for block in blocks:
n_rows = block.shape[0]
# 예시: 마지막 7행을 선거데이터 영역으로 가정
# (실제 데이터에 따라 이 인덱스는 조정 필요)
election_data = block.iloc[-7:].copy()
# 요약 데이터 항목: 특정 텍스트를 포함하는 행을 필터링
summary_items = election_data[election_data[1].isin(['합계', '거소·선상투표', '관외사전투표', '국외부재자투표'])]
# 나머지 행은 세부 내역으로 간주 (여기서는 단순 예시)
detail_items = election_data[~election_data[1].isin(['합계', '거소·선상투표', '관외사전투표', '국외부재자투표'])]
# 세부 데이터의 컬럼 재정리 (예시)
# 실제 파일의 컬럼 배치에 따라 해당 열 번호와 이름을 재정의해야 함
detail_items.columns = ['col'+str(i) for i in range(detail_items.shape[1])]
detail_items = detail_items.rename(columns={'col1': '읍면동', 'col2': '관내사전투표'})
# 최종적으로 요약 데이터와 세부 데이터를 하나의 DataFrame으로 결합
processed_block = pd.concat([summary_items, detail_items], ignore_index=True)
processed_block['district'] = block['district'].iloc[0]
processed_blocks.append(processed_block)
# 모든 블록을 하나로 합치기
final_df = pd.concat(processed_blocks, ignore_index=True)
```
> **주의사항:**
> – 위 코드는 파일의 실제 데이터 구조에 따라 인덱스(예: 마지막 7행)를 임의로 가정한 것입니다.
> – 만약 세부 내역의 행이 요약 데이터와 분리된 영역에 있다면, 해당 범위를 별도로 설정하여 추출해야 합니다.
> – 각 읍면동별 데이터에서 필요한 컬럼(예: 읍면동 이름, 관내사전투표 수치 등)이 어떤 열에 위치하는지 파악한 후, 적절히 컬럼명을 재설정하세요.
---
## 5. 처리된 데이터 저장 및 활용
최종적으로 재구조화된 데이터를 새로운 엑셀 파일이나 CSV 파일로 저장하여 추후 분석이나 보고에 활용할 수 있습니다.
```python
# 결과를 새로운 엑셀 파일로 저장
final_df.to_excel('/mnt/data/지역구_재구조화.xlsx', index=False)
```
---
## 결론
이번 포스팅에서는
1. **엑셀 파일 읽기**: pandas를 사용하여 헤더 없이 데이터를 불러오고,
2. **블록 분리**: B열의 “결과보기” 마커를 기준으로 각 선거구별 데이터 블록을 분리하며,
3. **데이터 구분**: 각 블록 내에서 7번째 아랫줄부터 시작하는 선거 데이터를 요약 데이터(“합계”, “거소·선상투표”, “관외사전투표”, “국외부재자투표”)와 세부 데이터(각 읍면동별 소계 및 관내사전투표)로 구분하고,
4. **재구조화**: 세부 데이터의 컬럼명을 재설정하여 보다 직관적인 형태로 정리하는 과정을 다루었습니다.
실제 데이터 파일의 구조가 다소 복잡할 수 있으므로, 각 단계에서 데이터의 위치와 인덱스, 컬럼명을 확인한 후 필요에 맞게 코드를 수정하는 것이 좋습니다. 이러한 방법을 통해 복잡한 선거구별 투표자료도 체계적으로 재정리하여, 데이터 분석이나 시각화, 보고서 작성 등에 활용할 수 있습니다.
이와 같이 Python과 Pandas를 활용하면 반복적이고 복잡한 데이터 정리 작업을 자동화할 수 있어, 앞으로 다양한 형태의 엑셀 데이터에도 응용해 볼 수 있습니다. 여러분도 파일 구조를 꼼꼼히 파악한 후, 이번 포스팅의 예제 코드를 참고하여 자신만의 데이터 정리 파이프라인을 만들어 보시길 바랍니다.