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

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

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

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

Python

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

pandas

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

Q&A

解決済

1回答

6318閲覧

3つのシートがあるExcelファイルデータを、シートのループ処理で1つのPandas DataFrameに結合(Merge,Concat)したいです。

Takashi8787

総合スコア43

openpyxl

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

Python

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

pandas

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

0グッド

0クリップ

投稿2021/04/07 08:11

同じテンプレートのシートが3つある、1つのExcelファイルのデータを、
シート毎にループして、整形したPandasのDataFrame(df)を作り、
3つのdfを結合(merge,concat)したものを、1つのDataFrameとしてExcelファイルに出力したいです。

以下のコードで実現できているのですが、
条件式のシート名があるときdfを作るという、おかしなコードになっており、
本来イメージしていたコードが実現できません。

### こちらが現状のコード wb = openpyxl.load_workbook(file) for ws in wb.worksheets: df = pd.read_excel(file, sheet_name=ws.title, header=#) ~~~ ここにdfを整形する処理 ~~~ # シート名の判定でdfを複数作る if sheet[0] == 'シート00': df00 = df elif sheet[1] == 'シート01': df01 = df if sheet[2] == 'シート02': df02 = df # 3つのDataframeの結合 df_result = pd.concat([df00, df01, df02], axis=0) # Excelファイルに書き出し df_result.to_excel(save_file)

こちらが、イメージ(書きたい)コードのロジックです。

# 空のdfを作る df_result = pd.DataFrame() wb = openpyxl.load_workbook(file) for ws in wb.worksheets: df = pd.read_excel(file, sheet_name=ws.title, header=#) ~~~ ここにdfを整形する処理 ~~~ # ループ毎にdf_resultに整形したdfを追加していくイメージ df_result = pd.merge(df_result, df, how='outer') # Excelファイルに書き出し df_result.to_excel(save_file)

しかし、これをすると、以下のようなエラーが出ます。

MergeError: No common columns to perform merge on. Merge options: left_on=None, right_on=None, left_index=False, right_index=False

そのため、現状は、シート名が分かっているテンプレートなので、
シート名で判別して、そのシート毎にdfを作成して、最後に結合・・・という形にしていますが、
シートの順番が変わったときや、シート名の変更等で対応できないコードになってしまっています。

理想としては、空のDataFrameに3つのDataFrameを順次追加していくようなコードが良いと思っています。
おそらく、pd.merge の部分になにかオプション引数などを設定すればよいのでは?と思っているのですが、
最初からdf_resultのカラム名を設定する方法以外に、方法が見つかってきません。

どなたか、このようなロジックを解決する方法がわかる方いましたら、ご教示頂けますと助かります。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

pd.read_excel()sheet_name=引数に整数のリストを与えるとその位置のシートを格納した辞書が返ってきます。
つまり、

python

1pd.read_excel(file, sheet_name=list(range(3)))

とすると、先頭から3シート分読み込みます。{シート名: データフレーム}の辞書が返ってきます。

辞書の値は.values()メソッドで取得できますから、それぞれを変換し、最後にpd.concat()で結合すれば所望のデータフレームになると思います。

したがって、例えば、以下のようなコードが想定されます。

python

1def func(df): 2 # なんらかの処理 3 return df 4 5 6df_list = [] 7for sub_df in pd.read_excel(file, sheet_name=list(range(3))).values(): 8 df_list.append(func(sub_df)) 9 10df = pd.concat(df_list)

投稿2021/04/07 08:45

kirara0048

総合スコア1399

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

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

Takashi8787

2021/04/07 10:01

ありがとうございます!いま、こちらのコードで試してみたところ、やりたいことがスッキリ短いコードで実装することができました! 具体的には、シート名の値もdf値に入れたかったので、 シート名一覧を wb = openpyxl.load_workbook(file) sheet_names = wb.sheetnames で取得し、ご教示いただいたコードを for s_name, sub_df in pd.read_excel(file, sheet_name=sheet_names).items(): df_list.append(func(s_name, sub_df)) とすることで、データをキレイに処理することができました。 全く違うロジックで解決しようとしていたので、辞書型でこんなにキレイにコードが書けることに感動しました。とても参考になりました。早く、自分で解決して、回答できる側にまわりたい。。。 本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問