Python 仕事の話

PythonによるExcelファイルの統合【指定した文字列が一致した場合のみ入力する】

※アフィリエイト広告を利用しています

SHIN

ガジェット好きの凡人会社員
未経験からシステム業務をしてる人
※Pythonでの業務効率化に挑戦中
自分の勉強の為の自由帳ブログ運営

こんにちはSHINです。

今回はPythonの得意分野であるExcelの処理について紹介します。

Pythonとその強力なライブラリであるpandasおよびtkinterを用いて、Excelファイルの操作とデータ結合を自動化する方法を紹介します。

このコードを活用することで、特に非技術者でもGUIを通じて容易に複数のExcelファイルを結合し、業務プロセスを効率化することが可能になります。

従業員データの一元管理など、様々な業務に応用できるこのスクリプトの詳細をご紹介します。

今回は二つのExcelファイルの指定したカラムが同じだった場合にまた別のカラムに値を入力し、別の新しいExcelファイルを生成してくれるといったものです。

よくある社員番号と氏名、情報が記載されたExcelファイルを用意します。情報の列のみわざと文字を変更しています。

この二つを読み込んで、社員番号と氏名が同じ行のみ情報の欄の項目を上書きするといったコード例となります。

話題のChatGPTを使ったプログラミングをするなら下の書籍がおススメです。

実際のコード

実際のサンプルコードは下記です。

※コピペでは使えないのであくまで参考にしてください

import pandas as pd
import tkinter as tk
from tkinter import filedialog, messagebox
import os

def select_excel_file(title):
    """ GUIを使用してExcelファイルを選択する """
    root = tk.Tk()
    root.withdraw()
    file_path = filedialog.askopenfilename(title=title, filetypes=[("Excel files", "*.xlsx")])
    root.destroy()
    return file_path

def save_excel_file(df):
    """ ユーザーがファイルを保存する場所を選択し、DataFrameをExcelファイルとして保存する """
    root = tk.Tk()
    root.withdraw()
    file_path = filedialog.asksaveasfilename(title="保存する場所を選択してください", filetypes=[("Excel files", "*.xlsx")], defaultextension=".xlsx")
    root.destroy()
    
    if file_path:
        df.to_excel(file_path, index=False)
        messagebox.showinfo("保存完了", f"ファイルが保存されました: {file_path}")
        return file_path
    else:
        messagebox.showinfo("キャンセル", "保存がキャンセルされました。")
        return None

def merge_excel_files(input_file, output_file):
    """ 2つのExcelファイルを結合する """
    df_input = pd.read_excel(input_file)
    df_output = pd.read_excel(output_file)
    #df_input = pd.read_excel(input_file, sheet_name=input_sheet_name)
    #df_output = pd.read_excel(output_file, sheet_name=output_sheet_name)

    # 社員番号と氏名でデータをマージし、情報のカラムを更新する
    merged_df = pd.merge(df_output, df_input, on=['社員番号', '氏名'], how='left', suffixes=('', '_input'))

    # 社員番号と氏名が一致する行のみ情報を更新する
    merged_df['情報'] = merged_df.apply(lambda row: row['情報_input'] if pd.notnull(row['情報_input']) else row['情報'], axis=1)

    # 確認カラムを追加し、一致しない行にメッセージを入れる
    merged_df['確認'] = merged_df.apply(lambda row: '社員番号と氏名が一致しない、もしくは空白です' if pd.isnull(row['情報_input']) else '', axis=1)

 

      # 不要なカラムを削除する
    merged_df = merged_df[['社員番号', '氏名', '情報', '確認']]

    return merged_df

# ユーザーにファイルを選択させる
input_file = select_excel_file("読み込むファイルを選択してください")
output_file = select_excel_file("マスターファイルを選択してください")

# ファイルを結合する
merged_df = merge_excel_files(input_file, output_file)

# 結果を保存するかどうかをユーザーに尋ねる
saved_file_path = save_excel_file(merged_df)

# 保存したファイルを開く(Windowsのみ)
if saved_file_path:
    os.startfile(saved_file_path)

 

これらはGUIを使用するのでファイルの読み込みから最後の保存先までユーザーが選べるように設計しています。

また、社員番号と氏名どちらかが間違っているもしくは空白の場合は確認欄を追加し、そちらに注意メッセージが出るようにもなっています。

 

こんな感じで確認の欄に注意メッセージがでるようになっています。

基本的に2つ目に読み込むファイルをマスターとするので、社員番号と氏名が一致しない行はそのままで確認欄にメッセージを出して確認を促します。

更新する列を増やしたい時

更新する列を増やしたい時は以下のように修正します。

※コピペでは使えないのであくまで参考にしてください

import pandas as pd
import tkinter as tk
from tkinter import filedialog, messagebox
import os

def select_excel_file(title):
    """ GUIを使用してExcelファイルを選択する """
    root = tk.Tk()
    root.withdraw()
    file_path = filedialog.askopenfilename(title=title, filetypes=[("Excel files", "*.xlsx")])
    root.destroy()
    return file_path

def save_excel_file(df):
    """ ユーザーがファイルを保存する場所を選択し、DataFrameをExcelファイルとして保存する """
    root = tk.Tk()
    root.withdraw()
    file_path = filedialog.asksaveasfilename(title="保存する場所を選択してください", filetypes=[("Excel files", "*.xlsx")], defaultextension=".xlsx")
    root.destroy()
    
    if file_path:
        df.to_excel(file_path, index=False)
        messagebox.showinfo("保存完了", f"ファイルが保存されました: {file_path}")
        return file_path
    else:
        messagebox.showinfo("キャンセル", "保存がキャンセルされました。")
        return None

def merge_excel_files(input_file, output_file, input_header_row, output_header_row):
    """ 2つのExcelファイルを結合する """
    df_input = pd.read_excel(input_file, header=input_header_row-1)
    df_output = pd.read_excel(output_file, header=output_header_row-1)

    # 社員番号と氏名でデータをマージし、更新するカラムを指定
    merged_df = pd.merge(df_output, df_input, on=['社員番号', '氏名'], how='left', suffixes=('', '_input'))

    # 更新するカラムを指定
    update_columns = ['情報', '予定日', '理由', 'その他', '場所']

    # 社員番号と氏名が一致する行のみ、指定したカラムを更新する
    for column in update_columns:
        merged_df[column] = merged_df.apply(lambda row: row[column + '_input'] if pd.notnull(row[column + '_input']) else row[column], axis=1)

    # 確認カラムを追加し、一致しない行にメッセージを入れる
    merged_df['確認'] = merged_df.apply(lambda row: '社員番号と氏名が一致しない、もしくは空白です' if all(pd.isnull(row[col + '_input']) for col in update_columns) else '', axis=1)

    # 不要な_inputカラムを削除する
    for column in update_columns:
        merged_df.drop(column + '_input', axis=1, inplace=True)

    # 最終的なカラムリストを作成
    final_columns = ['社員番号', '氏名'] + update_columns + ['確認']
    merged_df = merged_df[final_columns]

    return merged_df

# ユーザーにファイルを選択させる
input_file = select_excel_file("読み込むファイルを選択してください")
output_file = select_excel_file("マスターファイルを選択してください")

# ここでカラムが存在する行番号をユーザーから入力させるか、または固定値を用いる
input_header_row = 2  # 例: 読み込むファイルのカラム名が2行目にある場合
output_header_row = 4 # 例: マスターファイルのカラム名が4行目にある場合

# ファイルを結合する
merged_df = merge_excel_files(input_file, output_file, input_header_row, output_header_row)

# 結果を保存する
saved_file_path = save_excel_file(merged_df)

# 保存したファイルを開く(Windowsのみ)
if saved_file_path:
    os.startfile(saved_file_path)

 

今回のコードの説明

あまりにもざっくりとした説明だったので一応今回のコード内容をまとめておきます。

コードの概要

このコードは、Pythonを使用してExcelファイルを操作するためのGUIベースのスクリプトになっていて具体的には、以下の機能を提供します

Excelファイルの選択

    • ユーザーがグラフィカルユーザーインターフェース(GUI)を通じてExcelファイルを選択できるようにします。
    • tkinter ライブラリを使用してファイル選択ダイアログを表示します。

Excelファイルの結合

    • 2つの異なるExcelファイルを取り込み、特定の列(この場合は「社員番号」と「氏名」)を基にデータを結合します。
    • 結合されたデータは新たなDataFrameに保存されます。
    • 結合時に特定の条件に基づいてデータの更新や確認メッセージの生成を行います。

結果の保存

    • 結合されたデータを新しいExcelファイルとして保存します。
    • ユーザーはGUIを通じて保存先を選択できます。

保存されたファイルの自動開放

    • 保存されたExcelファイルを自動的に開く機能を提供します(ただし、この機能はWindows OSに限定されます)。

使用されている主要なモジュール

  • pandas: データ操作と分析のための強力なライブラリ。
  • tkinter: Pythonの標準GUIツールキット。

コードの目的

このコードは、特に業務の自動化やデータ管理タスクを簡素化することを目的としています。

例えば、人事部門が異なるソースからの従業員データを結合して一元管理する場合などに有用です。

コードの利点

  • GUIを使用することで、非技術者でも容易に操作できます。
  • データ結合プロセスを自動化することで、手作業によるエラーを減少させ、効率を向上させます。

まとめ

本記事では、Pythonを用いたExcelファイルの効率的な操作とデータ結合の方法をご紹介しました。

pandastkinterの強力な組み合わせにより、ユーザーフレンドリーなインターフェースで簡単にファイル選択やデータの結合、保存を行うことができます。

このスクリプトは、データ管理の自動化やエラーの減少、そして業務効率の向上に貢献することでしょう。特に、人事部門や管理部門において、従業員データの一元管理などに大きな価値を提供します。

話題のChatGPTを使ったプログラミングをするなら下の書籍がおススメです。

  • この記事を書いた人

SHIN

ガジェット好きの凡人会社員
未経験からシステム業務をしてる人
※Pythonでの業務効率化に挑戦中
自分の勉強の為の自由帳ブログ運営

-Python, 仕事の話