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

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

ただいまの
回答率

88.61%

連番になっているファイル名の読み込み

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,183

anpapa

score 16

以下のようになっているフォルダの中にtsv形式のファイル"test.dat"があり、各ファイルのデータを読み込んで最終的にはグラフにして表示したいと思いました。
まず最初は、連番の変数名を生成し、そこに各ファイルを読み込もうとしましたが、そういったときはリストを用いたほうが良いと調べたら出てきたので以下のようにリストを生成し、そこへ各フォルダを読み込もうとしました。

しかし、実行すると以下のようなエラーメッセージが出てしまい、調べると配列のサイズが違う為、ということがわかり、対策として、配列のサイズを変えてみましたが同じエラーが出ました。もしよろしければ解決するために皆様の知恵をお貸しいただけないでしょうか。
また、今回のような場合、別の方法を用いたほうがよければ、そちらの方法を教えていただいてもよろしいでしょうか、よろしくお願いいたします。

#追記、ファイルの配置
├── a350
│   ├── b100
│   │   └── test.dat
│   ├── b101
│   │   └── test.dat
│   ├── b102
│   │   └── test.dat
│   ├── b103
│   │   └── test.dat
│   ├── b104
│   │   └── test.dat
│   ├── b105
│   │   └── test.dat
│   ├── b106
│   │   └── test.dat
│   ├── b107
│   │   └── test.dat
│   ├── b108
│   │   └── test.dat
│   ├── b109
│   │   └── test.dat
│   └── b110
│       └── test.dat
├── a375
│   ├── b100
│   │   └── test.dat
│   ├── b101
│   │   └── test.dat
│   ├── b102
│   │   └── test.dat
│   ├── b103
│   │   └── test.dat
│   ├── b104
│   │   └── test.dat
│   ├── b105
│   │   └── test.dat
│   ├── b106
│   │   └── test.dat
│   ├── b107
│   │   └── test.dat
│   ├── b108
│   │   └── test.dat
│   ├── b109
│   │   └── test.dat
│   └── b110
│       └── test.dat
├── a400
│   ├── b100
│   │   └── test.dat
│   ├── b101
│   │   └── test.dat
│   ├── b102
│   │   └── test.dat
│   ├── b103
│   │   └── test.dat
│   ├── b104
│   │   └── test.dat
│   ├── b105
│   │   └── test.dat
│   ├── b106
│   │   └── test.dat
│   ├── b107
│   │   └── test.dat
│   ├── b108
│   │   └── test.dat
│   ├── b109
│   │   └── test.dat
│   └── b110
│       └── test.dat
├── a425
│   ├── b100
│   │   └── test.dat
│   ├── b101
│   │   └── test.dat
│   ├── b102
│   │   └── test.dat
│   ├── b103
│   │   └── test.dat
│   ├── b104
│   │   └── test.dat
│   ├── b105
│   │   └── test.dat
│   ├── b106
│   │   └── test.dat
│   ├── b107
│   │   └── test.dat
│   ├── b108
│   │   └── test.dat
│   ├── b109
│   │   └── test.dat
│   └── b110
│       └── test.dat
├── a450
│   ├── b100
│   │   └── test.dat
│   ├── b101
│   │   └── test.dat
│   ├── b102
│   │   └── test.dat
│   ├── b103
│   │   └── test.dat
│   ├── b104
│   │   └── test.dat
│   ├── b105
│   │   └── test.dat
│   ├── b106
│   │   └── test.dat
│   ├── b107
│   │   └── test.dat
│   ├── b108
│   │   └── test.dat
│   ├── b109
│   │   └── test.dat
│   └── b110
│       └── test.dat
├── a475
│   ├── b100
│   │   └── test.dat
│   ├── b101
│   │   └── test.dat
│   ├── b102
│   │   └── test.dat
│   ├── b103
│   │   └── test.dat
│   ├── b104
│   │   └── test.dat
│   ├── b105
│   │   └── test.dat
│   ├── b106
│   │   └── test.dat
│   ├── b107
│   │   └── test.dat
│   ├── b108
│   │   └── test.dat
│   ├── b109
│   │   └── test.dat
│   └── b110
│       └── test.dat
└── a500
    ├── b100
    │   └── test.dat
    ├── b101
    │   └── test.dat
    ├── b102
    │   └── test.dat
    ├── b103
    │   └── test.dat
    ├── b104
    │   └── test.dat
    ├── b105
    │   └── test.dat
    ├── b106
    │   └── test.dat
    ├── b107
    │   └── test.dat
    ├── b108
    │   └── test.dat
    ├── b109
    │   └── test.dat
    └── b110
        └── test.dat

コード

import os
import numpy as np
import pandas as pd
import seaborn as sns

box = np.zeros([8,21])
for aaa in xrange(350,525,25):
    for bbb in xrange(110,130,1):
        aaa=500
        filename='/{0}/{1}/test.dat'.format(aaa,bbb)
        aaa=(aaa-350)/25
        bbb=(bbb-110)
        box[aaa][bbb]=pd.read_csv('{0}'.format(filename),delimiter='\t',header=None,names=['1','2','3','4','5','6'])

エラーメッセージ

-------------------------------------
ValueErrorTraceback (most recent call last)
in <module>()
      4     aaa=(aaa-350)/25
      5     bbb=(bbb-110)
----> 6     box[aaa][bbb]=pd.read_csv('{0}'.format(filename),delimiter='\t',header=None,names=['1','2','3','4','5','6'])

ValueError: setting an array element with a sequence.
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

numpy.array には DataFrame は入らないので,使うなら list です.

ディレクトリ構成がこうなっているとすると,

├─a350
│  └─b100
│     └─test.dat
└─a375
    └─b100
      └─test.dat

こういう感じで書けます.

import pandas as pd
import os.path

box = [[0 for j, b in enumerate(range(100,101))] for i, a in enumerate(range(350,400,25))]
for i, a in enumerate(range(350,400,25)):
    for j, b in enumerate(range(100,101)):
        filename=os.path.join('a'+str(a), 'b'+str(b), 'test.dat')
        df = pd.read_csv(filename, delimiter='\t',header=None,names=['1','2','3','4','5','6'])
        box[i][j] = df

ただ,これだとどこに何が入っているかわからないので,別途位置と中身の対応が必要になると思います.

listではなくdictで書くと box[dir1][dir2] のようにディレクトリ名で任意のデータにアクセスできるので,こちらの方がいいかもしれません.

import pandas as pd
import os.path
from collections import defaultdict

box = defaultdict(dict)
for a in range(350,400,25):
    for b in range(100,101):
        dir1 = 'a'+str(a)
        dir2 = 'b'+str(b)
        filename=os.path.join(dir1, dir2, 'test.dat')
        df = pd.read_csv(filename, delimiter='\t',header=None,names=['1','2','3','4','5','6'])
        box[dir1][dir2] = df

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/20 15:12

    返信が遅れてしまい申し訳ありません、回答していただきどうもありがとうございます。
    まず、DataFrameをnumpyに格納することができず、listを用いたところ無事に格納できました、ありがとうございます。
    また、リストを用いた場合、インデックスナンバーと要素の関連がなくなってしまう為、どうしようかと自分なりに悩んだ結果が上のようなコードとなっているのですが、そちらの解決策として、dictを用いた方法も教えていただき、おかげさまで、私がやりたかっとことができました。
    まだ、dic関数の使い方をあまり理解できておりませんが、とりあえずやりたいことができるようになったので、こちらの回答をBAにさせていただきます。回答していただいたみなさん、どうもありがとうございました。

    キャンセル

+1

aaaの代入の部分と,bbbの代入の部分が理解出来ません.
可能でしたら,どういう意図なのかを明記していただけると助かります.

単純にnp.zeros関数で配列を作っていますが,8×12=96の要素が作られていますが,
xrangeは200ほど回るので配列の要素は足りなくなるかなと思います.

ちなみに,ファイル数がどの程度ある想定なのですか?
また,filenameも上記のコードではtest.datになり,連番ではありませんが大丈夫でしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/14 21:56

    回答していただき、どうもありがとうございます。
    失礼しました、実際のコードのまま載せると何か個人の特定につながる恐れがあるのかもしれないと思い、より一般的な書き方をしたつもりでしたが、そのせいで余計に分かりにくくなったようです。大変申し訳ありませんでした。
    実際にどのようにディレクトリに置いているかの図を配置し、また、質問の一部を変更させていただきます。

    キャンセル

  • 2017/07/15 00:59

    修正ありがとうございます。
    私もあまりpandasに詳しくないのですが、boxという変数にdataframeを代入できるのか疑問です。
    数値ではないといけない気がしますが、詳しくは試してみないと分かりません。

    もしかしたら、np.zeros関数ではなく単純に二次元配列に格納したら上手くいくかもしれません。

    キャンセル

+1

エラーの原因は、aaa の計算の間違いでしょう。

配列のIndexを無理やり算出するのではなく、シンプルにenumerate() を使って書いた方が良い気がします。

import numpy as np
import pandas as pd

box = np.zeros([7,20])
for i, aaa in enumerate(xrange(350,525,25)):
    for j, bbb in enumerate(xrange(110,130)):
        filename='/a{0}/b{1}/test.dat'.format(aaa,bbb)
        box[i][j]=pd.read_csv(filename, delimiter='\t',header=None,names=['1','2','3','4','5','6'])

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/20 14:35 編集

    返信が遅れてしまい申し訳ありません、回答していただきどうもありがとうございます。
    このようにインデックス付きで要素が得られる関数があったとは知らず勉強になりました。
    どうもありがとうございました。

    キャンセル

  • 2017/07/20 15:02

    すみません。
    what_alnkさんの回等の通り、numpy.ndarray には DataFrameは入りませんね・・・完全に抜けてました。
    とりあえず対策として、
    box = np.zeros([7,20])
    の部分を
    box = np.zeros([7,20]).tolist()
    と書き換えてリスト化すると良いかと思います。

    キャンセル

  • 2017/07/20 15:16

    早速、返信していただきどうもありがとうございます。
    実際にリスト化すると、無事格納することができました、ありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る