都道府県穴埋めゲーム

写真のように繰返し計算をして,Print関数で結果を出力しているのですが,これをDataFrameにすることは可能でしょうか.もしくは,直接DataFrameにて出力は可能でしょうか.
その場合のコードを,教えていただけると幸いです.

Python初心者なので,どのような言葉で検索していいかわからず,ここで質問させて頂いています.

ご回答よろしくお願い致します.

「Python 繰り返し文による出力方法」の質問画像

質問者からの補足コメント

  • すみません、不親切でした。

    read_xlsxでexcelファイルをよみこんで、それをdfとしてます
    dfは、写真の上のデータフレームです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/08/14 19:52
  • ライブラリはpandasとnumpyをimportしています.

    申し訳ありません.

    関係あるかはわからないですけど,jupyter labでコード?書いてます.

    よろしくお願いいたします.

    「Python 繰り返し文による出力方法」の補足画像2
    No.3の回答に寄せられた補足コメントです。 補足日時:2020/08/14 20:23
  • 何度もご回答いただき,まことにありがとうございます.
    そうなんですね,そのあたり,もう一度復習しなおします.
    毎回書き換えしてしますと,最初のデータをどのように出力するのかわからなくて困ってました.リスト内表記で解決できるんですね.勉強します.

    追加で質問させてください.
    今回,リストがかえって来てますが,以下のような写真のようにこれらがだんだんしたに連結していくことは可能でしょうか.(Treatmentやmeanなどは残ってても大丈夫です.)

    といいますのも,これらのデータをエクセルファイルで出力したいのですが,続きで
    df_group_2 = pd.DataFrame(df_group)
    df_group_2.to_excel("A.xlsx")

    としてしまうと,使い物にならないファイルが完成してしまいます.(当たり前でしょうが)
    大変忙しいと思いまが,ご回答いただければ幸いです

    「Python 繰り返し文による出力方法」の補足画像3
    No.4の回答に寄せられた補足コメントです。 補足日時:2020/08/14 22:31
  • 何度も答えて頂き誠にありがとうございます
    プログラミング言語を勉強してまだ1週間で,Python 以外のことは全く分からないですが,言語によっていろいろな特徴があるようですね.そのあたりももう少し勉強しようと思います

    教えて頂いたコードを実行してみると以下のようなエラーが出ました.調べてみると,下記URLのことを実践すればいいのかなと思うのですが,自分の実力では組み合わせ方がわかりません.お時間ありましたら,考えて頂けると幸いです
    https://pandas.pydata.org/pandas-docs/stable/ref …

    コードをcsvに書き換えると,求めていたcsvファイルが出力されたので,.xlsxにこだわる必要はないのですが,今後の勉強のために教えて頂けると助かります.
    追加でインポートしてみましたが..

    「Python 繰り返し文による出力方法」の補足画像4
    No.5の回答に寄せられた補足コメントです。 補足日時:2020/08/15 12:05
  • 何度も返信頂きありがとうございます.
    そうなんですね,ひとまずPythonもっと理解できるように頑張ります
    といっても,これが出来たら簡単なデータ解析,グラフ化,webスクレイピングができるので,何をしたらいいのか分からなくなっているのですが..

    すみません,またエラー出てしまいました
    写真左の番号でしたことを説明します
    83で教えて頂いたコードを実践したのですが,エラーが出てしまいました
    次に84で関係ありそうなものをimportして85で(pd.,,engine="openpyxl)を追加したら回ったのですが,エクセルファイルには,tiller_numのデータしかりませんでした(上書き保存されてしまい,heightのデータが消えた).あと,sheet_nameを指定しなかったら,2~10を飛ばしてsheet11にデータが格納されてました.なぜでしょう.これは,どうでもいいですが(笑)

    「Python 繰り返し文による出力方法」の補足画像5
    No.6の回答に寄せられた補足コメントです。 補足日時:2020/08/15 21:39

A 回答 (7件)

> プログラミング言語を勉強してまだ1週間で,Python 以外のことは全く分からないですが,言語によっていろいろな特徴があるようですね.そのあたりももう少し勉強しようと思います



いや、暫くPython「だけ」で充分だと思いますよ。よっぽどの事が無い限り、10年くらいは使えるんじゃないですか?
・・・実は機能的な話をすると、Pythonよりも遥かに強力な言語がこの世に存在するこたぁ存在します。ただ、現時点で「外部ライブラリの豊富さ」でPythonに敵う言語が無いんですよね。外部ライブラリの多さはPythonがダントツです。
ちなみに、30年位前だと「今まで誰も見たことも聞いた事もないソフトウェアを作る」って前提で「強力な言語」が欲されてたんですが、今だともう「新しいソフトウェア」って出し尽くされてんですよね。最近のAIとか言うのも、ぶっちゃけ、ネタそのものは30年くらい前には既にあったものです。当時と今と何が違うのか、と言うと要するにマシンの処理速度が滅茶苦茶上がった、と。だから「30年くらい前には"理論的には"可能、でも実用/民生レベルで実行するのは不可能だった」事が今やっと出来るようになった、と。大きく言うとそれだけなんですよ。
そうなると本当の意味での「新しいソフトウェア」ってのは既に殆ど全部出し尽くされていて、今はもっぱら「再発明の時代」なんですよね、基本的に。そういう時代だと「ライブラリの多さ」が鍵になってくる、と。だから暫くはPythonで安泰だろう、って事ですね。

> 調べてみると,下記URLのことを実践すればいいのかなと思う

ああ、アタリですね。
検索能力があるのは素晴らしい事です。
あと、インタプリタが出すエラーも読めるようになりましょう・・・英語だ、ってのが初見だと困るでしょうが。

TypeError: to_excel() got an unexpected keyword argument 'mode'

訳: to_excel() はキーワード引数'mode'なんか知らんっつってる。

・・・ふーむ、あっそ。その辺、to_csv()と違うんか。
っつー事は、4番目のヤツで行きますか。

with ExcelWriter("A.xlsx", mode = 'a') as writer: # ここで書き込みモードを指定する模様
  [i.to_excel(writer) for i in df_group]

で上手く行くかな?
対エクセルだと、Pythonでの通常のファイルの開き方に似たような構文でやるみたいですね(ちとメンド臭い・苦笑)。

7.2. ファイルを読み書きする:
https://docs.python.org/ja/3/tutorial/inputoutpu …
この回答への補足あり
    • good
    • 0

> といっても,これが出来たら簡単なデータ解析,グラフ化,webスクレイピングができるので,何をしたらいいのか分からなくなっているのですが..



プログラミングをもっと上手くなりたい、って言うのなら、自分でインタプリタを書いてみるのが一番ですね。
僕もこれ聞いた時、「え、何で?」とか思ったものですが(笑)、実はソフトウェアの基本は「インタプリタ」にあります。
極論すると、コンピュータってモノの動作は、原理的にはインタプリタなんです。何かしらを一行読んで、解釈して実行する。コンピュータのハードウェアも、一行、とは言ってもこれはメモリの一塊(32bitとか64bitとかのアレです)ですが、いずれにせよ、CPUが一行づつ読んで実行する。
そして、すべてのプログラムは、読み込み、評価、実行の繰り返しで物事を行います。これを専門的にはREPL(Read-Print-Eval-Loop)と呼ぶんですが、この形式をアタマに叩き込むには、「一番簡単な」(驚くべきことですが)例示がプログラミング言語のインタプリタを実際に実装することなんです。そしてプログラムを組み立てる際に、「読み込み」「評価」「実行」部分を上手く分離しないとワヤクチャなプログラムになってしまうんですね。
GUIなんかのプログラミングでもMVC、なんてモデルでプログラミングすればスッキリする、って言われてますけど、

MVC:
https://ja.wikipedia.org/wiki/Model_View_Control …

ぶっちゃけ、MVCもGUI版のREPLですね。とにかくプログラムを書く際、REPLを意識するのは基本です。すべてのプログラミング(書法)の基礎なんで、インタプリタを書いた事がある人とない人の差は結構あるんじゃないかな。そして入出力を分けて書く、とかデータは本体から分離しておく、とか言う「マナー」を学ぶにも良い教材だと思います。
Pythonを使った簡単な例題としては・・・若干古いんですが、次のサイトを紹介しておきます。

((Pythonで) 書く (Lisp) インタプリタ):
http://www.aoky.net/articles/peter_norvig/lispy. …

と言う辺りが余談で、本題に入りますか。

とは言っても・・・いやぁ、これはなかなか難問でしたねぇ。多分Excel側とのやり取りにそもそも問題があるんじゃないか。
どうやらExcel側での「追加」ってのがシート単位で行われるのが原因じゃねぇのかなぁ。csvだと簡単に行える事がExcelだと上手く行かない。結構厄介な性質をExcelが持ってるんで、ライブラリにライブラリをラップして接続せなアカンような状態になってんじゃねぇか。

と言うわけで、次のコードを実行してみてください。

with pd.ExcelWriter("A.xlsx") as writer: # もう追加書き込みもクソも関係ねぇ(怒
  [i.to_excel(writer, sheet_name = "sheet{0}".format(j)) \
  for i, j in zip(df_group, range(1, len(df_group) + 1))]

Python2時代だとちとメンド臭かったようなモノも3だとラクラク書けるのでありがたかったりします。
決め手は文字列のformatメソッドですね。最初見た時「何じゃこりゃ」とか思ったものですが(笑)、おかげで色々な文字列処理をラクに行える。C言語的な書式指定に悩まされる事がなくなりました。これを利用してシートナンバーを「生成」して、リストにまとめられたデータをシート毎に順繰りに書き出していきます。
range関数でformatメソッドに数値を埋め込んでいきます(結果シート番号に反映される)。range(1, 2)で生成しても良かったんですが、今後データが増加する事を考慮すると、len(df_group)で「データが増えた場合にも」対応した方がいいでしょうかね。
zipは2つのリストをまとめる関数ですが、これ内包表記で回す際に変数を(iとjに)分離します(アンパック等と言われます)。iの方はずーっと見てきた通り、dataframeオブジェクト、jは単なる整数ですね。
今回はWindows 10の方で確かめてみたんで、多分これで問題なく動くでしょう。
    • good
    • 0
この回答へのお礼

無事Excelファイル出力することができました.本当にありがとうございます.

この3日間,cametan_42さんからたくさんのことを学べて本当に楽しかったです.
この1週間は,googleで似たようなコードをコピペしてそれを少しいじって,思い通りに動けば本当にうれしくて.就職先も決まって,プログラミングは,業務効率化に使えたらいいなと思ってたぐらいでしたが,こんなに学んで楽しいので,cametan_42さんのおかげでもっとうまくなろうかなって思いました.

ひとまず,紹介して頂いたサイトに取り組んでみようと思います.
分からないことが出てくると思いますので,その際お手すきであれば,ご教授頂ければ幸いです.

何度も返信して頂き本当にありがとうございました.

お礼日時:2020/08/16 00:36

> 毎回書き換えしてしますと,最初のデータをどのように出力するのかわからなくて困ってました.



まあ、古典的なプログラミング書法ならいざ知らず、昨今だと「如何にデータを破壊せずに」プログラミングを行うのか、と言うのが主流になっています。ハードウェアを直にぶん殴るようなプログラムならいざ知らず、Python辺りの「高級言語」だと、「ハードウェア視点では無駄」と言われるような事はガンガンやるべきです(笑)。ハードウェア寄りで効率的なプログラミングはC言語辺りの領域でやるべきで、Pythonの領域じゃあありません(逆に言うと、ハードウェア寄りで考えてPythonを使うのはPythonの旨味が無くなる、って事です)。
と言うわけで、意識するのは「なるたけデータは書き換えない」です。データを書き換えさえしなければ、取り出し、加工は自由自在ですからね。

> 今回,リストがかえって来てますが,以下のような写真のようにこれらがだんだんしたに連結していくことは可能でしょうか.

データを書き換えるな、とか言っておいて何ですが(笑)、可能です。リストの旨味、と言うのはガンガン新規データを追加していっても良い、って事ですね。
そして、これはpandasを利用してるかどうか、ってのは関係ないです。あるリストに「リストじゃない」データを追加したい場合は、例えば

>>> ls = [1, 2]

として、

>>> ls.append(3) # 3を ls に追加する
>>> ls
[1, 2, 3]

です。もし、「別に作成したリストを追加したい」のなら、

>>> ls = [1, 2]
>>> ls = ls + [3, 4] # C言語風に ls += [3, 4] でも良い
>>> ls
[1, 2, 3, 4]

ですね。だからリストの中身がpandasで生成したデータなのかどうか、ってのは関係ありません。
ただ、気をつけておかないとならないのは、「追加するデータが同形式になっているかどうか」です。「追加は出来たけど形式が違うのでアクセスがしづらい」ってのは避けた方が良いですよねぇ。
それは「プログラミング言語の機能としてどうだ」って話じゃなくって、単に貴方がウッカリさんじゃないように、って事です(笑)。「出来たは良いけどアクセスできねー」ってのは良くある失敗です(笑)。みんな良くやるハマる(笑)。
そこだけは気をつけましょう。

> といいますのも,これらのデータをエクセルファイルで出力したいのですが,続きで
> df_group_2 = pd.DataFrame(df_group)
> df_group_2.to_excel("A.xlsx")
>
> としてしまうと,使い物にならないファイルが完成してしまいます.

あー、手元にExcelないんで詳しい事は分からないんですよね(Linux使ってるんで)。
でもそもそも、df_groupをファイルに書き出したいだけだったら、「基本的な発想は」そのまま

df_group.to_excel("A.xlsx")

でエエんちゃうかな。pd.DataFrameって変換がまずは必要ないと思います。
「基本的な発想は」と言うのは、実はこのままじゃあ上手く行きません。と言うのもdf_groupはリストだからです。だから「例によってリスト内包表記のお世話になる」。
試しに、

[i.to_excel("A.xlsx") for i in df_group]

とでも打ってみて下さい。恐らく、さっきと同じように「最後のデータだけ」Excelに書き込まれるんじゃないでしょうか。何故ならここでも「ファイルの書き換え」が行われてるから、ですよね。つまり、to_excelメソッドが上書き指示をしてるから、です。これを「追加モード」に変更すれば良い。
多分、上のコードを利用して、

[i.to_excel("A.xlsx", mode = "a") for i in df_group] # 追加記述モード

で上手く行くんじゃないでしょうかね。
手元にExcelが無いんで、代わりにcsvで試してみたら上手く行ったんで、多分pandasの外部ファイルへの書き込みの追加モードは「mode = "a"」で統一されてんじゃないか、って思います。
「Python 繰り返し文による出力方法」の回答画像5
この回答への補足あり
    • good
    • 0

> ライブラリはpandasとnumpyをimportしています.



はい、了解です。

ちなみに、Pythonってあまりに広範囲に使われてる為、基盤の言語は同じですが、ライブラリによっては用途も記述法も用いるデータ型も全然違ったりするんで、素のPythonを使う以外の場合は使用ライブラリは「必ず」併記した方が良いです。
例えば、numpyなんかはあまりに有名なんで、あまりうるさく言われなくはなっていますが、このライブラリは実は記述法に商用ソフトウェア、MATLABの影響が所々見られます。

MATLAB:
https://jp.mathworks.com/products/matlab.html

と言うか、ぶっちゃけ、「PythonでMATLABのような事がやりたい」ってだけで開発されてるんですよね。そうなると「MATLAB式の表現」を受け付ける為にPythonなのにそこそこ「尖った(と言うか浮いた)」表現が混じる事になる。MATLAB/Numpyに慣れた人ならイイんですが、あんまこのライブラリを使わない人には馴染みのない表現が頻出するわけです。それは「いくらPythonに慣れてても」困るケースになる。
繰り返しますが、Pythonは広範囲で使われている為、全部にわたって詳細を良く知ってる、って人はまずいません。だから「外部ライブラリを利用している」場合は必ず「使用ライブラリを」併記しましょう。その方が質問した際にもレスは圧倒的に早くつくでしょう。

と言うわけで本題に戻ります。

> これをDataFrameにすることは可能でしょうか.もしくは,直接DataFrameにて出力は可能でしょうか.

いや、コード見る限り、(DataFrameに)なってますよ。まあ、修正は必要ですが。
ちょっと自分の環境で、端末(なのかな)に次のように打って実行してみてください。

df_group

注: 何も表示されない場合、あるいはprint(df_group)と打つ。

多分次のように出てくるんじゃないでしょうか。

tiller_num
mean sum count max min std var
Treatment
CO2 40.50 162 4 44 37 3.109126 9.666667
CO2 + Light 40.25 161 4 49 35 6.075909 36.916667
Control 38.75 155 4 46 30 7.182154 51.583333

元々出力されてたブツの後半一つですよね。多分それが出力されています。
何故、後半だけなのか、と言うと、df_groupが最後に書き換えられたモノだからですね。

for i in (range(len(list_columns))): # ここは実はちょっと無駄があると思う。
 df_group = df[['Treatment', list_columns[i]]].groupby('Treatment').\ # ここで df_groupに最初作ったdfが編集された後、代入される。コード上、都合二回書き換えられるが、二回目は一回目を「上書き」してる。
      agg(['mean', 'sum', 'count', 'max', 'min', 'std', 'var'])
 print(i, df_group)

そうすると、「代入されている以上」、編集されたdf(最初に作ったDataFrame)はdf_group上に保存されてるわけですし、単純に「書き換え」しないで、全データをdf_groupにぶちこんでおけば、あとでprintするなり、如何用にも調理出来るわけです。
それはこうやります。

df_group = [df[['Treatment', i]].groupby('Treatment').\
    agg(['mean', 'sum', 'count', 'max', 'min', 'std', 'var'])
    for i in list_columns]

記述法は「リスト内包表記」と呼ばれるスタイルを用います。

リスト内包表記:
https://docs.python.org/ja/3/tutorial/datastruct …

> Python初心者なので,

だからこそ敢えて言いますが、Pythonを使う以上、まずは何が何でも最初に「リスト内包表記」を覚えましょう。
「繰り返し」が絡むウチ、8割はリスト内包表記で解決出来るコードです。つまり、「繰り返しが必要」な場合、まず最初に「リスト内包表記で記述出来ないか」考えるようにする。フツーのforやwhileでの記述は「リスト内包表記で表現が不可能な場合に限って」初めて行います。でも先に言った通り、80%の確率でforやwhileは書く必要はないです。それがPythonでの「スタイル」です。
別のトコにも以前書いたんですが、Pythonの「リスト内包表記」はPythonの開発者達に贔屓されてて、最適化が施されています。つまり、フツーにforやwhileで繰り返しを記述するよりスピードが速い。と言う事は、Python開発者達は「ユーザーにリスト内包表記を使いまくって欲しい」って思ってる、って事です。そういう開発者達からのメッセージは素直に受け取るべきですね。

さて、上のコードを実行するとdf_groupは次の値(リスト)を返すでしょう。

[ height
mean sum count max min std var
Treatment
CO2 75.525 302.1 4 79.6 72.1 3.744663 14.022500
CO2 + Light 71.875 287.5 4 73.2 71.0 1.037224 1.075833
Control 62.650 250.6 4 65.7 59.2 2.984962 8.910000, tiller_num
mean sum count max min std var
Treatment
CO2 40.50 162 4 44 37 3.109126 9.666667
CO2 + Light 40.25 161 4 49 35 6.075909 36.916667
Control 38.75 155 4 46 30 7.182154 51.583333]

要素数が2のリストなので、バラけたい場合はdf_group[0]とかdf_group[1]等とし、例えばdf_group[1]['tiller_num'][['sum', 'count']]とすれば二番目のデータからsumとcountの列のデータだけ返すような事も可能です。
この回答への補足あり
    • good
    • 0

っつーかちょっと独り言。



ひょっとしたら(かなりな確率で)素のPython使った・・・って話じゃなくって、「Google Colaboratory」上の話なんだろうか。
最近嫌にGoogle Colaboratory関連の投稿が増えてるんだけど、偶然なんだろうか。
どっかの学校が学生にGoogle Colaboratoryを使え、って推奨してるんだろうか。
推奨してる割には、学生をキチンとサポートしてないでぶん投げてるんだろうか。
だとしたらロクな学校じゃないんだけど、そういう学校に通う羽目になってる学生は可哀想なんじゃないだろうか。

Google Colaboratoryを推奨してる学校、キチンと学生を助けろよ(怒
この回答への補足あり
    • good
    • 0

> すみません、不親切でした。



> read_xlsxでexcelファイルをよみこんで、それをdfとしてます
> dfは、写真の上のデータフレームです。

いやいや。
そもそもデフォルトのPythonではDataFrameなんて言うデータ型は存在しないのです。
ですから、何らかのライブラリなぞをimportして「初めて」定義されるデータ型な筈なのですが、それを訊いているのです。
お分かりでしょうか?
    • good
    • 0

> Python初心者なので,



分かりました。
ただ、Pythonとは言っても、numpy使ってるのは分かりましたが、DataFrameが何を指すのかサッパリ分かりません。
色んな候補は思いつきますが、具体的に「何をもって」DataFrameを指すのか教えてもらえれば幸いですね。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!