teratail header banner
teratail header banner
質問するログイン新規登録
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

1182閲覧

python 連番ファイルの出力 f-stringの使い方

Tubasa1995

総合スコア83

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2022/08/28 09:55

0

1

実現したいこと

for文で各ループごとに、ループ内で作成したlistをデータフレームに変換したいと思っています。
その際に、リストからデータフレームに変換する際に、そのデータフレームの名前を連番となるように名前をつけたいのですができません。どのように修正すればよいのでしょうか?
最終的には
lst_nox_1 = pd.DataFrame(lst5)
lst_nox_2 = pd.DataFrame(lst5)
lst_nox_3 = pd.DataFrame(lst5)
.
.
.
lst_nox_11 = pd.DataFrame(lst5)
lst_nox_12 = pd.DataFrame(lst5)
のようなデータフレームをつくりたいです。

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

lst_nox_(f'{i}') = pd.DataFrame(lst5) ^ SyntaxError: cannot assign to function call

該当のソースコード

python

1for i in range(12): 2 lst5=[] 3 lst_nox_(f'{i}') = pd.DataFrame(lst5)

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

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

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

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

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

guest

回答4

0

python

1import sys 2import pandas as pd 3 4this_module = sys.modules[__name__] 5 6for i in range(1, 13): 7 lst5 = [] 8 setattr(this_module, f'lst_nox_{i}', pd.DataFrame(lst5)) 9 10print(lst_nox_1) 11print(lst_nox_12) 12print([nox for nox in dir(this_module) if nox.startswith('lst_nox')]) 13 14# 15Empty DataFrame 16Columns: [] 17Index: [] 18Empty DataFrame 19Columns: [] 20Index: [] 21['lst_nox_1', 'lst_nox_10', 'lst_nox_11', 'lst_nox_12', 'lst_nox_2', 'lst_nox_3', 'lst_nox_4', 'lst_nox_5', 'lst_nox_6', 'lst_nox_7', 'lst_nox_8', 'lst_nox_9']

投稿2022/08/28 13:03

melian

総合スコア21265

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

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

0

ベストアンサー

変数名で分ける必要性がなければ、各データフレームへのアクセスの利便性、メンテナンス性からTakaiYさんの回答にあるようにリストに格納したほうがよいと思います。

Python

1import pandas as pd 2 3dataframes = {} 4 5for i in range(12): 6 lst5 = [] 7 exec("lst_nox_{}= pd.DataFrame(lst5)".format(i + 1)) 8 9print("lst_nox_1", lst_nox_1) 10print("lst_nox_2", lst_nox_2) 11print("lst_nox_3", lst_nox_3) 12print("lst_nox_4", lst_nox_4) 13print("lst_nox_5", lst_nox_5) 14print("lst_nox_11", lst_nox_11) 15print("lst_nox_12", lst_nox_12) 16

出力

lst_nox_1 Empty DataFrame
Columns: []
Index: []
lst_nox_2 Empty DataFrame
Columns: []
Index: []
lst_nox_3 Empty DataFrame
Columns: []
Index: []
lst_nox_4 Empty DataFrame
Columns: []
Index: []
lst_nox_5 Empty DataFrame
Columns: []
Index: []
lst_nox_11 Empty DataFrame
Columns: []
Index: []
lst_nox_12 Empty DataFrame
Columns: []
Index: []
参考:【Python】変数名を動的に変更して変数を作成する方法 – exec()


追記1
最終的にやりたかったことはこういうことでしょうか?
lst5は不明のため適当に設定。
空のDataFrame lst_noxをまず作成
for文で lst5から作成したDataFrameを都度lst_noxに連結 を繰り返す)

実現したいことが明確になれば、より的確な回答が得られるかと思います。

Python

1import pandas as pd 2 3lst_nox = pd.DataFrame() 4for i in range(12): 5 lst5 = [i + 1, i + 2, i + 3] 6 lst_nox = pd.concat([ 7 lst_nox, 8 pd.DataFrame( 9 lst5, columns=['lst_nox_' + str(i + 1)], index=['R0', 'R1', 'R2']) 10 ], 11 axis=1) 12print(lst_nox)
lst_nox_1 lst_nox_2 lst_nox_3 lst_nox_4 lst_nox_5 lst_nox_6 lst_nox_7 lst_nox_8 lst_nox_9 lst_nox_10 lst_nox_11 lst_nox_12 R0 1 2 3 4 5 6 7 8 9 10 11 12 R1 2 3 4 5 6 7 8 9 10 11 12 13 R2 3 4 5 6 7 8 9 10 11 12 13 14

追記2
(コメントより引用)

どうも最後に横方向に結合をどうやれば分からず
であれば、追記1の応用で以下のような形で結合ができるかと思います。
(TakaiYさんの回答前提の処理で申し訳ありません)

Python

1lst_nox = pd.DataFrame() 2for i in range(12): 3 lst_nox = pd.concat([lst_nox, lst_nox[i]], axis=1)

投稿2022/08/28 11:10

編集2022/08/28 17:45
Crimson_Tide

総合スコア509

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

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

TakaiY

2022/08/28 12:17

質問への対応として、この回答のようにexecやevalを使う方法があります。 機能としてあるものなので、使うことに問題はありませんが、プログラム中でプログラムそのものを変更する方法なので使いかたによっては脆弱なプログラムになってしまうことや、変数名を明示しないことによってプログラムが読みにくくなることから、避けられるのであれば避けるべきだと思います。
Tubasa1995

2022/08/28 14:43

こんにちは。お二方とも丁寧に教えていただきありがとうございます。全然pythonやプログラミングに慣れていないの大変助かります。 じつは上記の質問の処理のあとに lst_nox = pd.concat([l lst_nox_1, lst_nox_2, lst_nox_3, ... lst_nox_12,], axis=1)のようにして横方向に結合して、最後に出力をしたかったんです。TakaiYのやり方が自分としてはしっくり来たのですが、どうも最後に横方向に結合をどうやれば分からず、結局Crimson_Tideのやり方でやりました。 TakaiYのやり方でも何かやれば横方向への結合はできたのでしょうか?
Crimson_Tide

2022/08/28 16:08

lst_nox_数字の変数名 はlst_noxを作るための中間変数だけのために必要だったのですか? もしそうであれば 「入力としてこういうデータがあって、最終的にこういうDataFrame(lst_nox)にしたい。 つきましては中間ファイルとして DataFrame(lst_nox_1~lst_nox_12)にしてそれをconcatしようかと考えている。そのためにlst_nox_?という変数を定義したいので、f-stringを使ってみたがうまくいかなかった。解決策を知りたい」 といったような質問をされた方が良かったかもしれないです。 入力データが不明なのと最終的なDataFrameのイメージが明確ではないですが、回答に追記してみました。追記のイメージのようなことを想定されているのでしょうか? ※私に対しては構いませんが、ニックネームとはいえ呼び捨ては如何なものでしょうか。「様」をつける方もいらっしゃいますが、せめて「○○さん」とされるべきかと存じます。
Tubasa1995

2022/08/28 17:14

lst_nox_数字の変数名 はlst_noxを作るための中間変数だけのために必要だったのですか? →その通りです。最終的なファイルの一部分を作って、最後にそれらを組み合わせて別のファイルをつくる予定でした。 ※私に対しては構いませんが、ニックネームとはいえ呼び捨ては如何なものでしょうか。「様」をつける方もいらっしゃいますが、せめて「○○さん」とされるべきかと存じます。 →すみません、完全に「さん」をつけるのを忘れていました、ついニックネームなのであまり名前という感覚がなく忘れていました。いつも呼び捨てにしているわけではありません。
Crimson_Tide

2022/08/28 17:53

TakaiYさんの処理後の結合を追記2に記載してみました。気が向いたら試してみてください。 > →すみません、完全に「さん」をつけるのを忘れていました、 失礼致しました。そういうことでしたら、私のコメントは忘れて頂いて結構です。
Tubasa1995

2022/08/29 10:46

Crimson_Tideさん まさに追記1がやりたかったことです。 ありがとうございます!
TakaiY

2022/08/29 11:06

解決してるのでいいのですが、ループで回さずに, lst_nox = pd.concat(lst_nox, axis=1) これ一発でできますよ。 ※ 役割の違うものを同じ名前で処理するのはよくないと思うのでlst_nox は2つに分けるべきだと思います。
guest

0

連番のついた変数名を作りたい場合、それはリストに格納するのが一般的ではないかと思います。

python

1lst_nox = [] 2lst_nox.append(pd.DataFrame(lst5)) 3lst_nox.append(pd.DataFrame(lst5)) 4. 5lst_nox.append(pd.DataFrame(lst5))

これで、lst_nox[0], lst_nox[1] などで各DFにアクセスできます。

投稿2022/08/28 10:36

TakaiY

総合スコア14536

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

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

0

そのデータフレームの名前を連番となるように名前をつけたいのですができません。
通常そのようなことはしません。

名前(文字列)でDataFrameを区別したいのであれば、辞書を利用した方法はどうでしょうか?

Python

1import pandas as pd 2 3dataframes = {} 4 5for i in range(12): 6 lst5=[] 7 dataframes['lst_nox_' + str(i+1)] = pd.DataFrame(lst5) 8 9print(dataframes) 10#{'lst_nox_1': Empty DataFrame 11 #Columns: [] 12 #Index: [], 13 #'lst_nox_2': Empty DataFrame 14 #Columns: [] 15 #Index: [], 16 #'lst_nox_3': Empty DataFrame 17 #Columns: [] 18 #Index: [], 19 #'lst_nox_4': Empty DataFrame 20 #Columns: [] 21 #Index: [], 22 #'lst_nox_5': Empty DataFrame 23 #Columns: [] 24 #Index: [], 25 #'lst_nox_6': Empty DataFrame 26 #Columns: [] 27 #Index: [], 28 #'lst_nox_7': Empty DataFrame 29 #Columns: [] 30 #Index: [], 31 #'lst_nox_8': Empty DataFrame 32 #Columns: [] 33 #Index: [], 34 #'lst_nox_9': Empty DataFrame 35 #Columns: [] 36 #Index: [], 37 #'lst_nox_10': Empty DataFrame 38 #Columns: [] 39 #Index: [], 40 #'lst_nox_11': Empty DataFrame 41 #Columns: [] 42 #Index: [], 43 #'lst_nox_12': Empty DataFrame 44 #Columns: [] 45 #Index: []}

投稿2022/08/28 10:21

meg_

総合スコア10980

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問