Sign In

pd

import pandas as pd import numpy as np # --- 1. 샘플 데이터 생성 --- # 실제 파일이 있다면 이 부분은 건너뛰고 파일 경로만 수정해서 사용하세요. # File1: 모든 데이터가 존재 data1 = {'co': [1, 2, 3, 4, 5], '내용': ['성공', '실패', '진행중', np.nan, '성공'], 'col1': ['val_a', 'val_b', np.nan, 'val_d', 'val_e']} df1 = pd.DataFrame(data1) df1.to_excel("file1.xlsx", index=False) # File2: '내용' 열이 부분적으로 비어있음 data2 = {'co': [1, 2, 3, 5, 6], '내용': ['성공', np.nan, '진행중', np.nan, '실패']} df2 = pd.DataFrame(data2) df2.to_excel("file2.xlsx", index=False) print("--- 원본 file1.xlsx ---") print(df1) print("\n--- 원본 file2.xlsx ---") print(df2) # --- 2. 데이터 불러오기 --- file1_path = 'file1.xlsx' file2_path = 'file2.xlsx' df1 = pd.read_excel(file1_path) df2 = pd.read_excel(file2_path) # --- 3. File1에서 이전할 데이터 필터링 --- # 조건: '내용'과 'col1'에 모두 값이 있는 데이터만 선택 source_data = df1[df1['내용'].notna() & df1['col1'].notna()].copy() # --- 4. 데이터 병합 (Merge) --- # 'co' 열을 기준으로 file2에 source_data를 병합합니다. # 겹치는 '내용' 열을 구분하기 위해 접미사를 붙입니다. merged_df = pd.merge(df2, source_data, on='co', how='left', suffixes=('', '_file1')) # --- 5. File2의 빈 필드 업데이트 --- # 조건: file2의 '내용' 열이 비어있는 경우 condition = merged_df['내용'].isna() # 조건을 만족하는 행의 '내용' 열을 file1에서 가져온 '내용_file1' 값으로 채웁니다. merged_df.loc[condition, '내용'] = merged_df.loc[condition, '내용_file1'] # --- 6. 최종 결과 정리 및 저장 --- # 필요한 열만 선택하여 결과물을 만듭니다. result_df = merged_df[['co', '내용']] output_path = 'file2_updated.xlsx' result_df.to_excel(output_path, index=False) print(f"\n--- 업데이트 완료 ---") print(f"결과가 {output_path} 파일에 저장되었습니다.") print("\n--- 업데이트된 file2_updated.xlsx 내용 ---") print(result_df)
import pandas as pd import numpy as np from openpyxl import load_workbook # --- (이전과 동일) 샘플 데이터 생성 --- # File1: 서식이 적용된 원본 파일이라고 가정 data1 = {'co': [1, 2, 3, 4, 5], '내용': ['성공', '실패', '진행중', np.nan, '성공'], 'col1': ['val_a', 'val_b', np.nan, 'val_d', 'val_e']} df1_sample = pd.DataFrame(data1) # (실제 파일에는 여기에 색상, 필터 등 서식이 있다고 가정합니다) df1_sample.to_excel("file1_with_formatting.xlsx", index=False) # File2: 업데이트의 기준이 될 파일 data2 = {'co': [1, 2, 3, 5, 6], '내용': ['성공', np.nan, '진행중', np.nan, '실패']} df2_sample = pd.DataFrame(data2) df2_sample.to_excel("file2_reference.xlsx", index=False) # ================================================================= # STEP 1: Pandas로 업데이트할 내용 결정 # ================================================================= print("--- Pandas 파트: 업데이트할 내용 분석 ---") file1_path = 'file1_with_formatting.xlsx' file2_path = 'file2_reference.xlsx' df1 = pd.read_excel(file1_path) df2 = pd.read_excel(file2_path) # 1. File1에서 이전할 데이터 필터링 source_data = df1[df1['내용'].notna() & df1['col1'].notna()].copy() # 2. File2와 병합하여 업데이트할 최종 목록 생성 merged_df = pd.merge(df2, source_data, on='co', how='left', suffixes=('', '_file1')) update_condition = merged_df['내용'].isna() & merged_df['내용_file1'].notna() # 3. 업데이트할 내용을 { 'co'값 : '새로운 내용' } 형태의 딕셔너리로 만들기 update_dict = merged_df.loc[update_condition].set_index('co')['내용_file1'].to_dict() print("업데이트 대상:", update_dict) # ================================================================= # STEP 2: OpenPyXL로 원본 파일에 데이터만 수정하고 저장 # ================================================================= print("\n--- OpenPyXL 파트: 원본 파일 서식 유지하며 업데이트 ---") # 원본 Excel 파일(서식 포함)을 불러옴 wb = load_workbook(file1_path) ws = wb.active # 활성화된 시트를 선택 # 헤더(첫 번째 행)를 읽어 각 열의 인덱스를 찾기 header = [cell.value for cell in ws[1]] co_col_idx = header.index('co') + 1 content_col_idx = header.index('내용') + 1 # 헤더를 제외한 두 번째 행부터 순회 for row in ws.iter_rows(min_row=2): co_val = row[co_col_idx - 1].value # 현재 행의 'co' 값이 업데이트 대상 딕셔너리에 있다면 if co_val in update_dict: new_content = update_dict[co_val] print(f"'co' 값 {co_val}의 '내용'을 '{new_content}' (으)로 업데이트합니다.") # 해당 행의 '내용' 셀 값을 새로운 값으로 변경 ws.cell(row=row[0].row, column=content_col_idx, value=new_content) # 변경된 내용을 새 파일 또는 덮어쓰기로 저장 output_path = "file1_final_updated.xlsx" wb.save(output_path) print(f"\n모든 서식을 유지한 채 업데이트 완료! 결과가 '{output_path}' 파일에 저장되었습니다.")