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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

Q&A

解決済

1回答

552閲覧

for文でループしながら、計算結果をExcelに保存したい。

ppap

総合スコア68

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

0グッド

1クリップ

投稿2022/08/18 12:34

編集2022/08/18 13:36

前提

Pythonでfor文を用いて、ループを行いながら、
計算結果をExcelブックに保存しようとしています。

ループが3つあり、内側のループから順に作成しました。
内側の2つのループを作成した段階までは問題なく動作していました。
しかし、最も外側にある"bt"に関するループを作成したところで、
Excelへの記入が行われなくなってしまいました。

実現したいこと

全ての計算結果を、Excelへ保存することを目指しています。
エラーメッセージが表示されないため、どこを修正すべきかが分からずに困っています。
(問題があるのは、btに関するループ内容だと思われます。)

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

エラーメッセージはありません。

該当のソースコード

Python

1#インポート 2import pandas as pd 3import scipy.stats as st 4import openpyxl as px 5 6 7#読み込むExcelファイルとシート名を指定 8df = pd.read_excel("読み込みファイルのパス,sheet_name = "シート名") 9 10#必要な列のみ指定 11cs = df.loc[:,["Boat", "Race", 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, "L1", "Rank"]] 12 13###btをループさせたい。 14b = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"] 15 16for bt in b: 17 # 18 #b値の指定 19 Boat_Type = cs.query("Boat=='@bt'") 20 # 21 ###rnを1-12までループさせたい。 22 r = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 23 # 24 for rn in r: 25 # 26 #レースの指定 27 Race_Num = Boat_Type.query("Race==@rn") 28 # 29 ###ptを0.1-L1までループさせたい。 30 t = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, "L1"] 31 # 32 for pt in t: 33 # 34 #相関を確認するデータ 35 Selection = Race_Num.loc[:,[pt, "Rank"]] 36 # 37 #"-"を含む行を削除 38 Correl = Selection[(Selection[pt] != '-') | (Selection["Rank"] != '-')] 39 # 40 #データフレームを配列に変換 41 Point = list(Correl[pt]) 42 FR = list(Correl["Rank"]) 43 # 44 #スピアマンの順位相関係数を導出 45 cor, pvalue = st.spearmanr(Point, FR) 46 # 47 #相関係数をメモするExcelブックを読み込む 48 wb = px.load_workbook("保存先Excelファイルのパス") 49 ws = wb["correl"] 50 # 51 #書き込みたい行数を取得 52 MaxRow = ws.max_row + 1 53 # 54 #相関係数等を書き込む 55 ws.cell(row = MaxRow, column = 1).value = bt 56 ws.cell(row = MaxRow, column = 2).value = rn 57 ws.cell(row = MaxRow, column = 3).value = pt 58 ws.cell(row = MaxRow, column = 4).value = cor 59 # 60 #excelを上書き保存 61 wb.save("保存先Excelファイルのパス") 62 63#end.

試したこと

rnとptに関するループ文はそのままに、bt部分に変数ではなく値を記入したところ問題なく動作しました。
そのため、問題があるのはbtのループ文であると思われます。

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

AnacondaでPythonを使用しています。

・Anacondaのバージョン:conda 4.12.0
・Pythonのバージョン:Python 3.9.12
・Windowsのバージョン:version 21H2

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

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

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

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

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

meg_

2022/08/18 13:12

> Excelへの記入が行われなくなってしまいました。 質問のコードを試したところExcelには何かしら保存されていました。質問者さんの環境では何もExcelに出力されていないということですか?
ppap

2022/08/18 13:23

はい。 おっしゃる通り、私の環境では何も出力されませんでした。
meg_

2022/08/18 13:29

エラーも発生せず、Excelに何も出力されないのですね。 こちらではExcelに保存されているためこれ以上の検証は出来ません。他の方からの回答をお待ちください。
ppap

2022/08/18 13:31

承知いたしました。 いつもアドバイスを頂き、ありがとうございます。 また別の機会に、ぜひよろしくお願いいたします。
guest

回答1

0

自己解決

Excelの下の方の行に、予め値が記入されていることが原因でした。
そのため、シートに値が記入されているにも関わらず、先頭行付近では
何も記入されていないように見えていました。

※Excelのシートにカラム以外の値がない状態で動作させたところ、
1~3列目のみ値が記入されるようになりました。

コードでは4行目にスピアマンの順位相関の計算結果を入力させているつもりでしたが、
上記のコードでは4行目に何も記入されませんでした。

そこで、

Boat_Type = cs.query("Boat=='@bt'")

を、以下のように変更したところ問題なく動作するようになりました。

Python

1#'@bt'の、シングルクォーテーションを削除しました。 2Boat_Type = cs.query("Boat==@bt")

変数の中身が「文字」の場合も「数値」の場合も、代入の仕方は変わらないというのがポイントでした。

投稿2022/08/19 15:37

ppap

総合スコア68

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問