2015-11-03 19 views
6

私は2つのインデックスを持つパンダのデータフレームを持っています。 (MultiIndex)df.as_matrix(...)のようなヌンキー行列を出したいのですが、この行列の形状は(n_rows, 1)です。私は形の行列(n_index1_rows, n_index2_rows, 1)が欲しいです。マルチインデックスからヌンディマトリックスへのパンダのデータフレーム

.groupby(...)を使用する方法はありますか.values.tolist()または.as_matrix(...)希望する形状を得るには?

EDIT:データ

               value 
current_date     temp_date           
1970-01-01 00:00:01.446237485 1970-01-01 00:00:01.446237489 30.497100 
           1970-01-01 00:00:01.446237494 9.584300 
           1970-01-01 00:00:01.446237455 10.134200 
           1970-01-01 00:00:01.446237494 7.803683 
           1970-01-01 00:00:01.446237400 10.678700 
           1970-01-01 00:00:01.446237373 9.700000 
           1970-01-01 00:00:01.446237180 15.000000 
           1970-01-01 00:00:01.446236961 12.928866 
           1970-01-01 00:00:01.446237032 10.458800 

これはアイデアの一種である:

np.array([np.resize(x.as_matrix(["value"]).copy(), (500, 1)) for (i, x) in df.reset_index("current_date").groupby("current_date")]) 
+0

3D配列が必要ですか?または、インデックスだけでなく列を含む単なる2D配列ですか? –

+0

3Dアレイ。 np.arrayのすべての値は、カラム値(インデックスではありません)である必要があります –

+0

希望の出力でサンプルデータを提供してください。 – Alexander

答えて

5

私が何をしたいことは、例えば、マルチインデックススタックを解除することだと思います

df.unstack().values[:, :, np.newaxis] 

編集:あなたが重複したインデックスを持っている場合は、アンスタッキング動作しません、とあなたはおそらく代わりにpivot_tableをしたい:

pivoted = df.reset_index().pivot_table(index='current_date', 
             columns='temp_date', 
             aggfunc='mean') 
arr = pivoted.values[:, :, np.newaxis] 
arr.shape 
# (10, 50, 1) 

ここunstackの完全な例です。まず、いくつかのデータを作成します:

current = pd.date_range('2015', periods=10, freq='D') 
temp = pd.date_range('2015', periods=50, freq='D') 
ind = pd.MultiIndex.from_product([current, temp], 
           names=['current_date', 'temp_date']) 
df = pd.DataFrame({'val':np.random.rand(len(ind))}, 
        index=ind) 
df.head() 
#        val 
# current_date temp_date   
# 2015-01-01 2015-01-01 0.309488 
#    2015-01-02 0.697876 
#    2015-01-03 0.621318 
#    2015-01-04 0.308298 
#    2015-01-05 0.936828 

は、今、私たちはマルチインデックススタックを解除:我々は、データの最初の4×4のスライスを紹介します:

df.unstack().iloc[:4, :4] 
#      val         
# temp_date 2015-01-01 2015-01-02 2015-01-03 2015-01-04 
# current_date            
# 2015-01-01  0.309488 0.697876 0.621318 0.308298 
# 2015-01-02  0.323530 0.751486 0.507087 0.995565 
# 2015-01-03  0.805709 0.101129 0.358664 0.501209 
# 2015-01-04  0.360644 0.941200 0.727570 0.884314 

は今numpyの配列を抽出し、へ再構築します[ nrows x ncols x 1]:

vals = df.unstack().values[:, :, np.newaxis] 
print(vals.shape) 
# (10, 50, 1) 
+0

私は 'ValueError:インデクスに重複したエントリがあり、再スタックできません。私はいくつかの 'temp_date'(しかし異なる値)を持ついくつかの行を持っています。 Id氏は数百万の索引を解体しなければならない。これを避ける方法はありますか? 'temp_date'やこれに類するものを再作成しますか? –

+0

ああ - あなたが重複していたことを知りませんでした。その場合は、必要な結果を得るために何らかの集計を行う必要があります(また、集計がデータに適しているかどうかを判断する必要があります)。ピボット・テーブルは良いアプローチです。 – jakevdp

関連する問題