프로젝트를 들어가면서 대규모 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)
데이터를 결합하고 필요한 컬럼을 선택한 뒤 파일을 제작한다

정상적으로 데이터셋을 구성하였다 성공!
'IT > 데이터분석 도전하기' 카테고리의 다른 글
| [파이널 팀 프로젝트] 로고 제작 (0) | 2024.04.02 |
|---|---|
| [데이터분석] 구성한 데이터 셋을 확인해보자 (0) | 2024.03.29 |
| [데이터 분석가] 데이터 분석가가 되고 싶다면? 이런 유형에게 딱! (0) | 2024.03.20 |
| cifar10 데이터 load 오류 해결하는 법 (0) | 2024.02.26 |
| [상관계수] 피어슨 상관계수와 스피어만 상관계수의 이해: 언제 어떤 것을 사용해야 할까? (0) | 2024.02.20 |