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

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

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

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

Q&A

解決済

1回答

1065閲覧

python_excel pandasを利用しての作成

ab7651

総合スコア2

Python

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

0グッド

0クリップ

投稿2020/09/08 14:13

編集2020/09/09 07:42

前提・実現したいこと

pythonのエクセルについて質問です。 あるエクセルシートが存在してそれをサンプル.xlsxとします。 サンプル.xlsxの中には A列 B列 C列 日付 会社名 売上 2020/8/20 A社 400 2020/8/21 B社 2000 2020/8/20 C社 100 2020/8/28 B社 500 ・ ・ ・ ・ ・ ・ ・ ・ ・ A・B・C列それぞれにはランダムに複数社の売上データが入っているとします。 行いたいことは新しいファイルを作成し B列にある会社の種類だけシートをその会社名で作成。 それぞれのシートに対応する会社名に対応するクロス集計表を作成したいのですが どの様なプログラムになりますか? コードは手探りで書いているのですが全然違う気もしてきてまして・・・

発生している問題・エラーメッセージ

FileNotFoundError Traceback (most recent call last) <ipython-input-80-547f5f2e3ff5> in <module> 14 for i in suppliers: 15 df["i"] = pd.DataFrame(dataList,columns=columns) ---> 16 with pd.ExcelWriter("新サンプル.xlsx",data_format='YYYY/MM/DD',datatime_format='YYYY/MM/DD',engine="openpyxl",mode='a')as writer: 17 df["i"].to_excel(writer,sheet_name="i",index=False) ~\anaconda3\lib\site-packages\pandas\io\excel\_openpyxl.py in __init__(self, path, engine, mode, **engine_kwargs) 23 from openpyxl import load_workbook 24 ---> 25 book = load_workbook(self.path) 26 self.book = book 27 else: ~\anaconda3\lib\site-packages\openpyxl\reader\excel.py in load_workbook(filename, read_only, keep_vba, data_only, keep_links) 311 """ 312 reader = ExcelReader(filename, read_only, keep_vba, --> 313 data_only, keep_links) 314 reader.read() 315 return reader.wb ~\anaconda3\lib\site-packages\openpyxl\reader\excel.py in __init__(self, fn, read_only, keep_vba, data_only, keep_links) 122 def __init__(self, fn, read_only=False, keep_vba=KEEP_VBA, 123 data_only=False, keep_links=True): --> 124 self.archive = _validate_archive(fn) 125 self.valid_files = self.archive.namelist() 126 self.read_only = read_only ~\anaconda3\lib\site-packages\openpyxl\reader\excel.py in _validate_archive(filename) 94 raise InvalidFileException(msg) 95 ---> 96 archive = ZipFile(filename, 'r') 97 return archive 98 ~\anaconda3\lib\zipfile.py in __init__(self, file, mode, compression, allowZip64, compresslevel) 1238 while True: 1239 try: -> 1240 self.fp = io.open(file, filemode) 1241 except OSError: 1242 if filemode in modeDict: FileNotFoundError: [Errno 2] No such file or directory: '"新サンプル".xlsx'

python

1import pandas as pd 2import os 3df = pd.read_excel("サンプル.xlsx",sheet_name="Sheet1") 4dateList = [] 5suppliers = [] 6columns = list(df.columns) 7sheetsList=list(df.keys()) 8for index , rows in df.iterrows(): 9 for row in rows: 10 work.append(row) 11 cell_value = df.iloc[:,1] 12 if cell_value in suppliers: 13 suppliers.append(cell_value) 14for i in suppliers: 15 df["i"] = pd.DataFrame(dataList,columns=columns) 16with pd.ExcelWriter("新サンプル.xlsx",data_format='YYYY/MM/DD',datatime_format='YYYY/MM/DD',engine="openpyxl",mode='a')as writer: 17 df["i"].to_excel(writer,sheet_name="i",index=False)

試したこと

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

python3.
anacondaを使用しております。
python自体はドがつく素人でVBAをちょっとかじっているレベルです。
pandasとopenpyxlの使い分けは分析 = pandas エクセル操作 = openpyxl の様なイメージで良いのでしょうか?

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

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

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

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

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

Supernove

2020/09/08 14:41

頂いたソースコードだとインデントが分かりにくいのでお手数ですが、以下のmarkdownの書き方を参考にしてソースコードを掲載し直して頂いてもいいでしょうか? Pythonはインデントがなくなるとfor文の内容が分からないのでお手数ですが、ご対応お願いします。 ご対応いただければ質問内容にご回答します。 https://teratail.com/help#about-markdown
meg_

2020/09/08 22:22 編集

・コードは「コードの挿入」で記入してください。 ・エラーメッセージは省略せずに全て掲載してください。
ab7651

2020/09/09 07:23

ご丁寧にありがとうございます。 修正してみます!
guest

回答1

0

ベストアンサー

エラーメッセージの解決策になりますが、Excelファイルに新規で書き出すのであれば
df["i"].to_excel('新サンプル.xlsx',sheet_name="i",index=False)
だけでできます。逆にpd.ExcelWriterを使うと既存のエクセルファイルに対してデータを書き込むメソッドになるはずなので注意が必要です。
あと、df["i"]だと、for文の変数iではなく文字列iという認識になってしまい、今度はindex Errorになると思うので、変数iとしてインデックスを参照するのであればdf[i]に直したほうがいいです。sheet_nameも同様です。

あとの箇所は問題ないと思いますが、出力したシートが意図したものと違う場合は頑張って修正してみましょう。

ちなみに、ライブラリの使い分けについては大体あっていますが、細かく言うと

  • pandas:データ分析、エクセルデータへの書き込み
  • openpyxl:pandasの裏側でexcelの読み書きを行うために使われる

というイメージです

投稿2020/09/09 09:01

Supernove

総合スコア1154

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

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

ab7651

2020/09/11 02:02

遅くなってごめんなさい! 回答有難うございました。頂いた指摘点を元に修正中です。 また質問させて頂きます、有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問