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

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

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

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

Python

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

Q&A

解決済

1回答

22502閲覧

for文でファイルを連続して読み込みたいのです。

yoshihiko_

総合スコア8

Python 3.x

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

Python

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

0グッド

4クリップ

投稿2018/02/04 15:52

編集2018/02/04 15:58

現在データ処理をしたく、pythonのpandasを勉強しています。

そこで一つのディレクトリに入っている複数のCSVを次々に読み込んでDataFrameを作りたく、
for文を用いて処理しようとしているのですが、うまく行きません。

当該コードは以下のようになります。

実現したいことを逐一記すと…
import pandas as pd

df13_001 = pd.read_csv("13_001.csv", header = 1)
df17_001 = pd.read_csv("17_001.csv", header = 1)
df19_001 = pd.read_csv("19_001.csv", header = 1)
・・・これが複数続く。

これを処理するために、

list = ["13", "17", "19"]
for i in list:
"row_df"+i+"_001" = pd.read_csv(""i"_001.csv" , header = 1)

とやっているのですが、うまくいきません。

print("row_df"+i+"_001")

とするとこの部分は処理できているようなので、後半部分が問題だと思います。
どのように記述すれば良いか教えていただけないでしょうか。
このコードの書き方以外にもこう書いたら良いよというのがあれば、よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

文字列で変数名を表現することは基本的に出来ないのです。
代わりに辞書を使って記述すれば良いと思いますよ。

Python

1df_dict = {} 2for num in ['13', '17', '19']: 3 df_dict[num] = pd.read_csv(f'{num}_001.csv', header=1)

投稿2018/02/04 16:00

編集2018/02/04 16:00
LouiS0616

総合スコア35660

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

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

yoshihiko_

2018/02/04 16:20

早速のご回答ありがとうございます。 実行するとエラーなく実行できたのですが、得られたdictionaryについて 複数のcsvファイルが一つの辞書になっています。 現在調べているところなのですが、これはバラシてDataFrameにできるでしょうか?
yoshihiko_

2018/02/04 16:41 編集

失礼致しました。 dframe = dict["13"] などとすることで呼び出せました。 あとは df13_001 = dict["13"] df17_001 = dict["17"] df19_001 = dict["19"] という形に変換したのですが、これについてfor文等で記述する方法はありますでしょうか?
mkgrei

2018/02/05 00:21

dict["13"]として使うのが一般的です。 どうして変数名に数字を埋め込みたいのでしょうか? またdictは組み込み関数です。 https://docs.python.jp/3/library/functions.html LouiS0616さんのコードのようにdf_dictなどの他の名前にすることをおすすめします。
LouiS0616

2018/02/05 03:42

@yoshihiko_ さん 方法がないわけではないですが、実現した際のメリットがほとんどないのです。 どうしてもそのように変換したい理由があるのでしょうか? @mkgrei さん 補足感謝いたします。
yoshihiko_

2018/02/05 10:08

mkgrei様、LouiS0616様 ご回答ありがとうございます。 理由といたしましては、複数の地域における温度の時系列データを扱いたいのですが、それらの場所を5桁の数値で管理しているのです。 例えばA市とB市のコードが12345と12346のようになっており、それらの名前と気温データの取得年がアンダースコアでつながれた、12345_2017のような名前のCSVファイルが大量にあり、これらをデータフレームとして扱いたいのです。 少し長くなってしまうのですが、CSVデータの内容は、 0 2016/1/4 10 1 2016/1/5 12 2 2016/1/6 12 3 2016/1/7 12 4 2016/1/8 13 のようになっていまして、これらのデータを行方向に市の名前(つまり列名が市の名前)、そして過去データを列方向にどんどん足していきたいのです。 df_dict = {} for num in ['13', '17', '19']: df_dict[num] = pd.read_csv(f'{num}_001.csv', header=1) のようにして取り込みますと、 {'30022_2017': 0 2017-01-01 3 1 2017-01-02 4 2 2017-01-03 3 ... 365 2017-12-31 9 '3101_2017': 0 2017-01-04 1 1 2017-01-05 1 ...のようになってしまい、ますので、 一度それぞれの市ごとにデータフレームを作成してからconcatしようとした次第なのです。
LouiS0616

2018/02/05 11:57

それで、実際にご希望の処理を記述出来たとして、その後はどうするのでしょうか。 変数名が野放図になってしまうと、ループを使った効率的な処理が出来なくなります。 多くのプログラミング言語で変数名を文字列から決定する方法が特殊であるのも、それによって得られる利益より損失の方が大きいからです。 やはり『文字列から変数を生成する方法』より『文字列で変数にアクセスする方法』を検討した方が、保守性の面で優れていますし、現実的かと思います。
LouiS0616

2018/02/05 11:59

それぞれの市毎にアクセスしたいのなら、 df_dict[市名][年]という風な構造に出来ないか検討してみてください。 ...というより、pandasだったら一回全部並べて、市をキーにソートしたり出来るのでは?
yoshihiko_

2018/02/05 12:04

なるほど、そういうところまで考えてあるのですね… 完全に勉強不足です>< 頂いたヒントを元にもう少し考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問