2017-04-24 7 views
0

ここで質問する前に多くのことを試してみました。助けをお待ちしています。pandasデータフレームを連結します。マルチインデックスレベルを維持する

私は一緒にマージし、マルチインデックスレベルに基づいてそれらをソートすることができる集約関数の積である2つのデータフレームを持っています。ここで

どのように見えるかです:最終的に私が出て選択できるようにしたいと思い

  y2014 y2014  y2014 y2015 y2015 y2015 
      2q  2q  2q  1q  1q 1q 
      min  median mean median mean min 
Serials      
#3843442115 600  1,148 1,171 2,100 364 40 
#5243420535 1,100 1,375 1,359 1,650 169 33 
#0843451718 1,100 1,450 1,429 1,750 178 27 
#7442431510 750  950  975  1,200 112 24 
#7443431921 775  925  972  1,300 155 23 
#7442431323 700  950  925  1,100 97  21 

 Serial year  quarter min  median  mean   max 
0 #474331000 2014  2 2350000 2350000 2.350000e+06 2350000 
1 #484110AD1 2014  2 185000 185000 1.850000e+05 185000 
2 #484114BA0 2014  2 126000 126000 1.260000e+05 126000 

    Serial year quarter min median  mean  max   
0 #484118020 2015  1  100  100  100  100    
1 #484119AF0 2015  1 160000 165250 165250 170500  
2 #484121AG0 2015  1 120000 120000 120000 120000  

が、私は何かがこれに似ている取得するために一緒にそれらをマージしたいのですがメトリック、年、四半期ごとの結果をプロットし、それらの経時変化をプロットします。

データフレームに単純なインデックスがあり、上記のように年と四半期の各ラベルにタグを付けると、複数のインデックスが必要な場合とない場合があります。

インデックスを設定した後、データフレームをマージして目的の結果を得る方法を見つけることができませんでした。

(年、四半期、メトリック)マルチインデックスレベルでデータフレームをマージ、クエリ、ソートするのに役立つよう、正しい方向で私を指摘できますか?

ありがとうございました

答えて

0

解決策の1つは、列名を設定することです。上のようにしてください。

result.columns=[['year']*6,['quarter']*6,['min','median','mean','max','std','count']] 

その後、これらの列名に基づいてスライスすることができます。ここで

0

あなたが行く:あなたのデータに基づいて

生の入力を:

>>> df1 
     Serial year quarter  min median  mean  max 
0 #474331000 2014  2 2350000 2350000 2350000.0 2350000 
1 #484110AD1 2014  2 185000 185000 185000.0 185000 
2 #484114BA0 2014  2 126000 126000 126000.0 126000 
>>> df2 
     Serial year quarter  min median mean  max 
0 #484118020 2015  1  100  100  100  100 
1 #484119AF0 2015  1 160000 165250 165250 170500 
2 #484121AG0 2015  1 120000 120000 120000 120000 

あなたは

あなたが使用することができます
>>> df1_transformed = df1.set_index(['Serial', 'year', 'quarter']).unstack().unstack() 
>>> df2_transformed = df2.set_index(['Serial', 'year', 'quarter']).unstack().unstack() 
>>> df1_transformed 
       min median  mean  max 
quarter   2  2   2  2 
year   2014  2014  2014  2014 
Serial 
#474331000 2350000 2350000 2350000.0 2350000 
#484110AD1 185000 185000 185000.0 185000 
#484114BA0 126000 126000 126000.0 126000 
>>> df2_transformed 
       min median mean  max 
quarter   1  1  1  1 
year   2015 2015 2015 2015 
Serial 
#484118020  100  100  100  100 
#484119AF0 160000 165250 165250 170500 
#484121AG0 120000 120000 120000 120000 

を探しているマルチインデックス列にそれらを変換df1_transformed.reorder_levels([2,1,0], axis=1)あなたが好きな列インデックスの順序を取得するために、私は単純にするためにそれを残しています。

最後にそれらを結合:

>>> final = pd.concat([df1_transformed, df2_transformed], axis=1) 
>>> final 
        min  median  mean  max  min median \ 
quarter    2   2   2   2   1   1 
year    2014  2014  2014  2014  2015  2015 
#474331000 2350000.0 2350000.0 2350000.0 2350000.0  NaN  NaN 
#484110AD1 185000.0 185000.0 185000.0 185000.0  NaN  NaN 
#484114BA0 126000.0 126000.0 126000.0 126000.0  NaN  NaN 
#484118020  NaN  NaN  NaN  NaN  100.0  100.0 
#484119AF0  NaN  NaN  NaN  NaN 160000.0 165250.0 
#484121AG0  NaN  NaN  NaN  NaN 120000.0 120000.0 

       mean  max 
quarter   1   1 
year   2015  2015 
#474331000  NaN  NaN 
#484110AD1  NaN  NaN 
#484114BA0  NaN  NaN 
#484118020  100.0  100.0 
#484119AF0 165250.0 170500.0 
#484121AG0 120000.0 120000.0 

あなたの生の入力データは、シリアル番号の重複がないため、最終マトリックスは、多くのNaN秒を持っています。シリアル番号が重複している場合は、NaNが記入されます。

関連する問題