[프로젝트] 대규모 파일 병합하기 feat.프로젝트

프로젝트를 들어가면서 대규모 csv파일을 처리할 일이 생겼다. 세미 프로젝트때는 데이터 크기가 작아 전처리 때 힘이 덜들었는데 이번엔 열 값만 18만개가 나와 엑셀로 온전히 열리지가 않는다...그래서 이를 해결하고 파일을 병합한 과정을 올리고자 한다...


데이터가 커서 제대로 열리지 않는다

 

이번 프로젝트에 사용하는 데이터수
파워피벗을 이용하여 데이터 확인

Mysql을 활용해서 데이터를 확인하려고 했으나 데이터량이 너무 많아 Excel Powerpivot을 활용하여 데이터를 확인했다

위 데이터는 따릉이 이용량으로 날씨 데이터와 유동인구 데이터와 결합할 예정이다. 데이터가 작으면 복붙 노가다를 할 수 있지만 그러면 며칠 걸릴것 같으므로 코드를 사용해서 데이터를 병합해보겠다.

 

2022년 7월 따릉이 데이터 병합하기 

import pandas as pd

# 첫 번째 CSV 파일 읽기
df1 = pd.read_csv("C:/Users/cen04/Downloads/file/2207.csv")

# 두 번째 CSV 파일 읽기
df2 = pd.read_csv('C:/Users/cen04/Downloads/file/따릉이대여소정보.csv')

# 두 데이터프레임을 대여소명 열을 기준으로 병합
merged_df = pd.merge(df1, df2, on='대여소명')

# 필요한 열들만 선택하여 새로운 데이터프레임 생성
selected_columns = ['일시', '대여소번호', '대여소명', '시간대', '거치대수량', 'addr1', 'addr2']
final_df = merged_df[selected_columns]

# 최종 데이터프레임 확인
print(final_df)
print(final_df['시간대'])

 

먼저 7월 따릉이 대여건수와 따릉이대여소정보를 가져온다.

# 첫 번째와 두번째 파일 병합본
df1 = final_df

# 세 번째 파일 읽기
df2 = pd.read_csv("C:/Users/cen04/Downloads/file/7월/7월기온.csv")

# 병합본에서 '일시' 컬럼 변환 (format: '2022-07-01' -> '20220701')
df1['일시'] = pd.to_datetime(df1['일시']).dt.strftime('%Y%m%d')

# 병합본에서 '시간대' 컬럼 변환 (format: '1' -> '0100')
df1['시간대'] = df1['시간대'].apply(lambda x: str(x).zfill(2) + '00')
df2 = df2.dropna()
df2['hour'] = df2['hour'].astype(int)

# 추가할 파일에서 'day' 컬럼 변환 (format: '1' -> '20220701') 및 데이터 타입 일치
df2['day'] = '202207' + df2['day'].astype(str).str.zfill(2)
df2['hour'] = df2['hour'].astype(str).str.zfill(4)

#print(df1['시간대'])
#print(df2['hour'])

# 데이터프레임 병합
merged_df = pd.merge(df1, df2, left_on=['일시', '시간대'], right_on=['day', 'hour'])

#print(merged_df)

# 필요한 열들만 선택
selected_columns = ['일시', '대여소번호', '대여소명', '시간대', '거치대수량', 'addr1', 'addr2', 'value']
final_df = merged_df[selected_columns]

# 'value' 열의 이름을 '강우량'으로 변경
final_df = final_df.rename(columns={'value': '기온'})

# 최종 데이터프레임 확인
print(final_df)

 

기온 파일을 가져와 일시와 시간대를 기준으로 파일 조인한다

 

# 추가할 파일 읽기
df2 = pd.read_csv("C:/Users/cen04/Downloads/file/7월/7월강수형태.csv")
df2 = df2.dropna()
df2['hour'] = df2['hour'].astype(int)
# 추가할 파일에서 'day' 컬럼 변환 (format: '1' -> '20220701') 및 데이터 타입 일치
df2['day'] = '202207' + df2['day'].astype(str).str.zfill(2)
df2['hour'] = df2['hour'].astype(str).str.zfill(4)

# 데이터프레임 병합
merged_df = pd.merge(final_df, df2, left_on=['일시', '시간대'], right_on=['day', 'hour'])

# 필요한 열들만 선택
selected_columns = ['일시', '대여소번호', '대여소명', '시간대', '거치대수량', 'addr1', 'addr2', '기온', 'value']
final_df = merged_df[selected_columns]

# 'value' 열의 이름을 '강우량'으로 변경
final_df = final_df.rename(columns={'value': '강수형태'})

# 최종 데이터프레임 확인
print(final_df)

 

비슷하게 강수형태 파일을 가져와 일시와 시간대를 기준으로 파일 조인한다

 

# 새로운 파일 읽기
df2 = pd.read_csv("C:/Users/cen04/Downloads/file/LOCAL_PEOPLE_DONG_202207.csv", index_col=False)

dong_mapping = {
    11500535: ' 등촌3동',
    11500603: ' 가양1동',
    11500604: ' 가양2동',
    11500615: ' 우장산동',
    11500591: ' 화곡6동'
}

# 행정동 코드를 행정동명으로 변경
df2['행정동명'] = df2['행정동코드'].map(dong_mapping)
# 병합본에서 '일시' 컬럼 변환 (format: '2022-10-01' -> '20221001')
df2['기준일ID'] = df2['기준일ID'].astype(str)
# 병합본에서 '시간대' 컬럼 변환 (format: '1' -> '0100')
df2['시간대구분'] = df2['시간대구분'].apply(lambda x: str(x).zfill(2) + '00')
df2.head()

 

행정동 데이터를 가져와 조인할 수 있게 데이터를 변환한다

 

# 데이터프레임 병합
merged_df = pd.merge(filtered_df, df2, left_on=['일시', '시간대', 'addr1'], right_on=['기준일ID', '시간대구분', '행정동명'])

# 필요한 열들만 선택
selected_columns = ['일시', '대여소번호', '대여소명', '시간대', '거치대수량', 'addr1', 'addr2', '기온', '강수형태', '강수량', '총생활인구수']
final_df = merged_df[selected_columns]
final_df.head()

# 대여소번호가 특정 값들 중 하나인 행 추출
filtered_df = final_df[final_df['대여소번호'].isin([1124, 1153, 1158, 1160, 1166, 2701, 2715, 2721, 2728, 3798])]

# 추출된 행들을 새로운 파일로 저장
filtered_df.to_csv('C:/Users/cen04/Downloads/file/7월/07월.csv', index=False)

 

데이터를 결합하고 필요한 컬럼을 선택한 뒤 파일을 제작한다

 

정상적으로 데이터셋을 구성하였다 성공!