質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

410閲覧

【python】2つのExcelから一致する名前を抽出する方法

nanoko

総合スコア10

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2023/08/31 09:13

前提

pythonにて、社員一覧リストと表彰一覧表の二つのExcelファイルを照らし合わせ、表彰者一覧表に記載されている名前と社員一覧リストに記載されている名前が一致した場合、該当者に加点をするという処理を行っています。
しかし、社員一覧リストは姓と名の間にスペースが空いており、表彰者一覧表にはスペースが空いていないため、一致する名前を抽出できていない状態です。

名前の記載方法を統一させることが手っ取り早い解決策ではありますが、このような状態でも正しく名前の抽出を行うことができるのか気になったため、どなたかご教示願います。

コードを一応記載いたしましたが、この方法では不可能であるため参考程度です。

該当のソースコード

#コードは該当部分のみです。左辺が社員一覧リスト、右辺が表彰者リストです if ws_new.cell(row=a,column=2).value == ws_hyousyou.cell(row=b,column=16).value:     ws_new.cell(row=a,column=7).value = ws_new.cell(row=b,column=7).value + 1

試したこと

表彰一覧表の名前を"含む"文字列を社員一覧リストから抽出する方法を思いつきましたが、「田中健太」と「田中健」のような社員がいた場合には、対応できなくなってしまうため断念しました。
また、スペースを削除する方法も調べてみたところ、左右などの端のスペースは削除できるものの中央のスペースは削除できないとの記載がありました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

下記のような自前のtrim関数を作り、半角空白、全角空白を削除してから比較すれば良いかと。

python3

1def MyTrim(vstr): 2 vstr = vstr.replace(" ","") 3 vstr = vstr.replace(" ","") 4 return vstr 5

呼び出し側

python3

1val1 = MyTrim(ws_new.cell(row=a,column=2).value) 2val2 = MyTrim(ws_hyousyou.cell(row=b,column=16).value) 3if val1 == val2: 4 ws_new.cell(row=a,column=7).value = ws_new.cell(row=b,column=7).value + 1 5

投稿2023/08/31 09:51

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanoko

2023/09/01 01:28

ご回答ありがとうございます。 既存の関数で操作することしか頭にありませんでした。 とても勉強になります。
guest

0

pandasタグついていたので補足的な回答です。

提示されている抜粋コードから推測すると2重ループで処理していると思います。
表彰一覧表から加点辞書を作成することにより、1重ループで処理できます。
(社員一覧リストもpandasで操作してよければループ不要ですが)

Python

1import pandas as pd 2from io import StringIO 3pd.set_option('display.unicode.east_asian_width', True) 4 5# 表彰一覧表から加点辞書を作成 6s = """name,subject 7岸田文雄,国語 8菅義偉,国語 9岸田文雄,数学 10安倍晋三,数学""" 11df = pd.read_csv(StringIO(s)) 12awards = df.groupby('name').size().to_dict() 13print(awards) # {'安倍晋三': 1, '岸田文雄': 2, '菅義偉': 1} 14 15# 社員一覧リストをループで処理 16df = pd.DataFrame({'name':'岸田 文雄,菅 義偉,安倍 晋三,野田  佳彦'.split(',')}) 17df['point'] = 0 18for i in range(len(df)): 19 name = df.iloc[i,0] 20 name = name.translate(str.maketrans({' ':'',' ':''})) # 空白を取り除く 21 df.iloc[i,1] = awards.get(name, 0) 22 23print(df) 24""" 25 name point 260 岸田 文雄 2 271 菅 義偉 1 282 安倍 晋三 1 293 野田  佳彦 0 30"""

投稿2023/09/01 00:57

can110

総合スコア38343

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanoko

2023/09/01 01:25

ご回答ありがとうございます。 辞書を作成する方法で解決できるのですね。 pandasで操作する分には問題ありませんので、非常に勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問