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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

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

Q&A

解決済

1回答

379閲覧

execを関数に組み込みたい

754x

総合スコア20

Python 3.x

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

0グッド

1クリップ

投稿2022/10/04 06:52

前提

csvファイルをデータフレームに読み込む際に、ファイル名ごとに列選択して読み込みたい

これを実現するためにexec関数を用いたところ、エラーは出力されませんがexec関数が通っていないという事象が起こりました。

実現したいこと

csvファイルをデータフレームに読み込む際に、ファイル名ごとに列選択して読み込みたい

該当のソースコード1(正しく動くコード)

Python

1test_arr = [column1,column2] 2 3test= "テスト" 4df = pd.read_csv(FOLDER+test+".csv", sep=',') 5print("選択前:" + str(len(df.columns))) #出力 100 6exec_command = "df = df["+test+"_arr]" 7exec(exec_command) 8print("選択後:" + str(len(df.columns))) #出力 2 9 10#以下dfを操作し可視化を行いますが、本題と関係がないので省略します 11 12#出力 13選択前:100 14選択後:2

該当のソースコード2(正しく動かないコード)

Python

1test_arr = [column1,column2] 2 3def select(test): 4 df = pd.read_csv(FOLDER+test+".csv", sep=',') 5 print("選択前:" + str(len(df.columns))) 6 exec_command = "df = df["+test+"_arr]" 7 exec(exec_command) 8 print("選択後:" + str(len(df.columns))) 9 #以下省略 10 11test = "テスト" 12select(test) 13 14#出力 15選択前:100 16選択後:100

試したこと

関数として定義するとexecが動いていないことが確認できていますが
exec関数を使うのが初めてなこともあり、原因がわかりません

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

Windows11
VSCodeでipynbファイルで動かしています

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

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

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

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

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

melian

2022/10/04 08:11 編集

read_csv() には usecols というキーワードがあって、読み込むカラムを指定することができます。 df = pd.read_csv(FOLDER+test+".csv", sep=',', usecols=test_arr)
754x

2022/10/04 08:31

ありがとうございます。
guest

回答1

0

ベストアンサー

求めているものとは違う方向の回答になってしまいますが、こうすべきと思うので。

質問からすると、

python

1ほげ_arr = [column1,column2] 2ふが_arr = [column1,column2] 3 4for txt in ["ほげ", "ふが"] 5 df = df[txt_arr]

のように使いたいけれど、変数に入った文字列(ほげとかふが)から対応する変数名を作りたいということで、execを持ち出したということだと思います。
ですが、この考えは筋が悪い悪手です。

連番の入った変数や、変数を使って変数を切り替えたい場面に出会った場合、元のデータにリスト(番号の場合)や辞書(文字列の場合)を使うのが正しい筋です。

python

1list_info = {} 2list_info['ほげ'] = [column1,column2] 3list_info['ふが'] = [column1,column2] 4 5for txt in ["ほげ", "ふが"] 6 df = df[list_info[txt]]

のようにしたほうがいいでしょう。

投稿2022/10/04 07:24

TakaiY

総合スコア12801

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

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

754x

2022/10/04 08:31

早速の回答ありがとうございます。 実現したいことを達成できたため、ベストアンサーにさせていただきました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問