2017-12-30 30 views
0

まず、私のコードには、私が知っている以上に多くの間違いがあるかもしれません。私は次の画像のように私のテーブルのインデックスを作成しようとしています: 私は漸進的に列を読んでいると一緒に、私は合計15000行ごとに500ファイルを読んでそれらを追加しています。今度は、次の図のようにMultiIndexを使用する必要がありますが、pandas階層インデックスとMultIndexを使用してループ内で行う方法が見つかりませんでした。すべてのデータポイントと数値のループを作成する方法はありますか?Pythonでループを持つ階層型マルチインデックステーブル

enter image description here


all_data = pd.DataFrame() 

for f in glob.glob("path_in_dir"): 
    df = pd.read_table(f, delim_whitespace=True, 
        names=('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'), 
        dtype={'A': np.float32, 'B': np.float32, 'C': np.float32, 
          'D': np.float32,'E': np.float32, 'F': np.float32, 
          'G': np.float32,'H': np.float32}) 

    all_data = all_data.append(df,ignore_index=True) 

all_data.index.names = ['numbers'] 

私が追加使用していますが、私は速度を上げるために重要であろうこれもpd.concatのような効率的ではないというどこかで読んすべてのデータ

print(all_data)

を表示メモリ使用量を削減できます。私はエラーを取得するall_data = pd.concat(df,ignore_index=True):私はこの方法でそれをしようとすると

最初の引数は、パンダのオブジェクトの反復可能でなければならない、あなたは私が唯一のD列を取得します現時点ではタイプ「DATAFRAME」

のオブジェクトが渡さ0から行の最後まで数えます。したがって、30000までの2つのファイルに対してです。したがって、各ファイルのデータポイントにカウントを分割するわけではありません。

私はインデックスを拡張: `all_data.index.names = [データポイント、数字] はメッセージとValueErrorを取得する:新しい名前の長さは1でなければならないが、このような何かを試してみてください2

+0

あなたはどのような困難に遭遇していますか?入力ソースとは何ですか?すべてのデータを含む単一のDataFrameを取得できましたか? .set_index(['col1'、 'col2']) 'を実行してみましたか?現時点では、あなたが試したことやあなたがどこにいるのかわからないので、何を助けるべきかを明確にしていません。 –

+0

@JonClementsあなたの助けていただきありがとうございます私の問題についてのより良い考えを得るために私の答えをご覧くださいありがとう – newpyguy

+0

元のデータの例を投稿できますか? –

答えて

0

を得ました。ループ内で実行できるので、all_dataを宣言する必要はありません。辞書部分は、探しているマルチインデックスの作成にも役立ちます。

# make a test txt file 
txt = open('df1.txt', mode = 'w') 
txt.write('1 2 3 4 5 6 7 8 \n2 4 6 8 10 12 14 16') 
txt.close() 

# make a dictionary for storing the dataframes 
dataframes = {} 

# import files with for-loop in my current working directory (otherwise a different path) 
for file in enumerate(glob.glob(os.getcwd()+'/*.txt')): # using *.txt to only retrieve .txt files 
    dataframes.update({file[0] + 1: pd.read_table(file[1], delim_whitespace = True, names = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'), dtype = { 
     'A' : np.float32, 
     'B' : np.float32, 
     'C' : np.float32, 
     'D' : np.float32, 
     'E' : np.float32, 
     'F' : np.float32, 
     'G' : np.float32, 
     'H' : np.float32 
    })}) 

# concat dataframes together 
df = pd.concat(dataframes, axis = 0) 

# label indices to match wanted output 
df.index.names = ['Datapoint', 'number'] 

df 

output

+0

ありがとう、私はPythonの初心者ですが、私はこのようなことをやってみました:まず、データポイントと数値を作るより大きなデータフレームにすべてのファイルを読み込んでいます。私はそれを自動化し、できるだけ多くのメモリを使用しないようにしたい。コードについては、私の答えをご覧ください。 – newpyguy

関連する問題