前提・実現したいこと
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'
import pandas as pd
import os
df = pd.read_excel("サンプル.xlsx",sheet_name="Sheet1")
dateList = []
suppliers = []
columns = list(df.columns)
sheetsList=list(df.keys())
for index , rows in df.iterrows():
for row in rows:
work.append(row)
cell_value = df.iloc[:,1]
if cell_value in suppliers:
suppliers.append(cell_value)
for i in suppliers:
df["i"] = pd.DataFrame(dataList,columns=columns)
with pd.ExcelWriter("新サンプル.xlsx",data_format='YYYY/MM/DD',datatime_format='YYYY/MM/DD',engine="openpyxl",mode='a')as writer:
df["i"].to_excel(writer,sheet_name="i",index=False)
試したこと
補足情報(FW/ツールのバージョンなど)
python3.
anacondaを使用しております。
python自体はドがつく素人でVBAをちょっとかじっているレベルです。
pandasとopenpyxlの使い分けは分析 = pandas エクセル操作 = openpyxl の様なイメージで良いのでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
エラーメッセージの解決策になりますが、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の読み書きを行うために使われる
というイメージです
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
Supernove
2020/09/08 23:41
頂いたソースコードだとインデントが分かりにくいのでお手数ですが、以下のmarkdownの書き方を参考にしてソースコードを掲載し直して頂いてもいいでしょうか?
Pythonはインデントがなくなるとfor文の内容が分からないのでお手数ですが、ご対応お願いします。
ご対応いただければ質問内容にご回答します。
https://teratail.com/help#about-markdown
meg_
2020/09/09 07:21 編集
・コードは「コードの挿入」で記入してください。
・エラーメッセージは省略せずに全て掲載してください。
ab7651
2020/09/09 16:23
ご丁寧にありがとうございます。
修正してみます!