2017-06-08 9 views
1

パンダのデータフレームからマルチインデックスを作成しようとすると、今どこでもブラウジングに時間を費やしていました。これは私が(。Excelシートのモックアップを投稿私はパンダのデータフレームでこれを持っている)しているデータフレームです:既存のデータフレームからマルチインデックスを作成する

have

そして、これは私が欲しいものです:私は

を試してみました

want

newmulti = currentDataFrame.set_index(['user_id','account_num']) 

ただし、マルチインデックスではなくデータフレームを返します。また、私は 'user_id'レベル0と 'account_num'レベル1を作る方法を見つけることができませんでした。私はこれは自明でなければならないと思うが、私は非常に多くの投稿、チュートリアルなどを読んだことがあります。部分的に私は非常に視覚的な人であり、ほとんどの投稿はそうではないからです。助けてください!

+0

となり、両方のテーブルは同じです。しかし、表示のために、私は参照することをお勧めします:[stackoverflow.com/a/25127764/2306662](https://stackoverflow.com/a/25127764/2306662) – nikpod

+0

しかし、私はマルチインデックスが必要と思った私は(すべてのアカウントの)総売上高と日付をプロットしたいですか? – puifais

+0

@puifaisなぜあなたは2つめのデータフレームをプロットできませんか? –

答えて

2

この場合、単にgroupbyを使用すると、要求された列に沿った売上を合計すると自動的にマルチインデックスが作成されます。

df.set_index(['user_id', 'account_num', 'dates']) 

あなたはおそらく、例えば2つ以上の同一user_idaccount_numdate値を持つ行が異なる売上高(任意の重複を避けたいものの:あなたは、単にこれを行うことができるはず

df.groupby(['user_id', 'account_num', 'dates']).sales.sum().to_frame() 

)を合計すると、groupbyを使用することをお勧めします。

マルチインデックスが必要な場合は、viat new_df.indexにアクセスします。ここで、new_dfは、上記の2つの操作のいずれかで作成された新しいデータフレームです。

そしてuser_idはレベル0とaccount_numあろうレベル処理の目的のために1

+0

これは、user_id、account_num、およびdatesでグループ化し、販売データを取り出すことを意味します。販売データのuser_id、account_num、およびdateが同じである場合は、合計します。それは正しい? – puifais

+1

並べ替え...これは、売上データを集計することを意味します。列が数値でない場合は、合計することはできません。ラムダ関数で 'first'、' last'、 'unique'のようなものを使う必要があります。 – Alexander

0

currentDataFrame.set_index(['user_id','account_num'])によって返されたデータフレームは['user_id','account_num']

newmulti.indexに設定し、それのインデックスは、マルチインデックスオブジェクトを返しますしています。

+0

ええと...私は分かりません。どうすればいいですか?newmulti = currentDataFrame.set_index(['user_id'、 'account_num']) 'そして' newmultiReal = newmulti.index'ですか?あなたは明確にしていただけますか?私はパンダで全く新しいです。 – puifais

+0

あなたの最終目標は何ですか?元のデータフレームをマルチインデックスで使用したい場合は、既にそれを取得しています。 –

1

使用pd.MultiIndex.from_arrays

lvl0 = currentDataFrame.user_id.values 
lvl1 = currentDataFrame.account_num.values 

midx = pd.MultiIndex.from_arrays([lvl0, lvl1], names=['level 0', 'level 1']) 
関連する問題