以下のようになっているフォルダの中に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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
aaaの代入の部分と,bbbの代入の部分が理解出来ません.
可能でしたら,どういう意図なのかを明記していただけると助かります.
単純にnp.zeros関数で配列を作っていますが,8×12=96の要素が作られていますが,
xrangeは200ほど回るので配列の要素は足りなくなるかなと思います.
ちなみに,ファイル数がどの程度ある想定なのですか?
また,filenameも上記のコードではtest.datになり,連番ではありませんが大丈夫でしょうか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+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'])
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/07/20 15:12
まず、DataFrameをnumpyに格納することができず、listを用いたところ無事に格納できました、ありがとうございます。
また、リストを用いた場合、インデックスナンバーと要素の関連がなくなってしまう為、どうしようかと自分なりに悩んだ結果が上のようなコードとなっているのですが、そちらの解決策として、dictを用いた方法も教えていただき、おかげさまで、私がやりたかっとことができました。
まだ、dic関数の使い方をあまり理解できておりませんが、とりあえずやりたいことができるようになったので、こちらの回答をBAにさせていただきます。回答していただいたみなさん、どうもありがとうございました。