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

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

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

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

Python

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

Q&A

解決済

2回答

1717閲覧

pythonで、dataframe名を用いた文字列を作成したいが設定がうまくできない

yasu_00

総合スコア9

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2020/03/05 07:54

前提・実現したいこと

分析に使ったデータフレームをcsvファイルにエクスポートする際に、
エクスポートしたいデータフレーム名をexport_dataに指定するだけで、
パス名とファイル名をいちいち変更する必要なく出力できるコードを作成しています。
その際に、以下のエラーメッセージが発生しました。

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

/content/drive/My Drive/Colab Notebooks/df_target.csv --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-110-b8be81b8c1a3> in <module>() 8 #csvに出力 9 with open(path, 'w', encoding = 'utf-8-sig') as f: ---> 10 utilize_data.to_csv(f) AttributeError: 'str' object has no attribute 'to_csv'

該当のソースコード

python

1#出力したいデータフレームの設定 2utilize_data = "df_target" 3 4#ファイルのパスの設定 5root = '/content/drive/My Drive/Colab Notebooks/Edanz/' 6path = "{}{}.csv".format(root,utilize_data) 7print(path) 8 9#csvに出力 10with open(path, 'w', encoding = 'utf-8-sig') as f: 11 utilize_data.to_csv(f)

試したこと

上記のエラーを見るに、utilize_dataが文字列になっているので、
データを出力できないことは分かりました。
そこで下記のように、(1)に加えて、(2)でもダブルクォーテーションマークなしのデータフレーム名を
指定してあげることでファイルは出力できました。
しかし、(1)の部分一箇所だけの指定でファイルを出力できるようにしたいです。
("'" + df_coverage + "'" のようにも設定してみましたが、通常の文字列の結合のようにうまくいきませんでした。)

python

1#出力したいデータフレームの設定 2utilize_data = "df_target" #(1) 3 4#ファイルのパスの設定 5root = '/content/drive/My Drive/Colab Notebooks/Edanz/' 6path = "{}{}.csv".format(root,utilize_data) 7print(path) 8 9#csvに出力 10with open(path, 'w', encoding = 'utf-8-sig') as f: 11 df_target.to_csv(f) #(2)

利用環境

google colaboratory, python 3.6.9

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

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

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

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

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

guest

回答2

0

python

1#出力したいデータフレームの設定 2utilize_data = "df_target" #(1) 3 4#ファイルのパスの設定 5root = '/content/drive/My Drive/Colab Notebooks/Edanz/' 6path = "{}{}.csv".format(root,utilize_data) 7print(path) 8 9locals()[utilize_data].to_csv(path)

でどうでしょうか。

locals()で、「変数名: オブジェクト」の辞書を得ることができます。

投稿2020/03/05 08:10

kirara0048

総合スコア1399

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

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

yasu_00

2020/03/05 10:49

早速ありがとうございました!初めてteratailを使ったので、即レスに感動しました。シンプルな解決策で勉強になりました!
guest

0

ベストアンサー

変数名は通常の文字列ではなく、プログラム上でだけ存在する記号です。コードの柔軟性、パフォーマンス、セキュリティなどの観点から、変数名に対して処理を行う(文字列から変数を取る)ことは通常行いません。

そのことを理解した上で、どうしても必要であればeval関数を用いて相当する処理が可能です。eval関数は受け取った文字列を式として評価した結果を返します。

python

1with open(path, 'w', encoding = 'utf-8-sig') as f: 2 eval(utilize_data).to_csv(f)

これはかなり汚いやり方です。もう少しきれいなやり方としては、予め何らかのデータ構造に格納しておくという手があります。

python

1dfs = dict() 2dfs["df_target"] = df_target 3 4utilize_data = "df_target" 5root = '/content/drive/My Drive/Colab Notebooks/Edanz/' 6path = "{}{}.csv".format(root, utilize_data) 7 8#csvに出力 9with open(path, 'w', encoding='utf-8-sig') as f: 10 dfs[utilize_data].to_csv(f)

これだけだと何が嬉しいのかよくわからないかもしれませんが、下記の理由でエレガントです。

  • 実際にはdf_target変数は作らなくても良い。データフレームを作って即dfs["df_target"]に入れておき、一貫してdfs["df_target"]で扱うことが出来ます。
  • 辞書なので辞書としてループ処理等が行え、処理の自動化に向きます。

ただし、Jupyterで対話的に使うにはこのやり方の利益はさほどない気もするので、妥協してevalするのも一つの選択ではあります。

投稿2020/03/05 08:08

hayataka2049

総合スコア30933

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

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

yasu_00

2020/03/05 10:50

勉強になるコメントをありがとうございました。理由まで記述してくださり、非常にありがたく思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問