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

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

ただいまの
回答率

88.36%

python_excel pandasを利用しての作成

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 203

ab7651

score 2

前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 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

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

    キャンセル

回答 1

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の読み書きを行うために使われる
    というイメージです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/11 11:02

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

    キャンセル

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

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る