2016-08-15 5 views
1

を組み合わせたときに、インデックスと列の順序を保持私たちは、次のデータフレームを持っていると言う:データフレーム

import pandas as pd 
import numpy as np 

df1_column_array = [['foo', 'bar'], 
      ['A', 'B']] 
df1_column_tuple = list(zip(*df1_column_array))  
df1_column_header = pd.MultiIndex.from_tuples(df1_column_tuple) 

df1_index_array = [['one','two'], 
      ['0', '1']] 
df1_index_tuple = list(zip(*df1_index_array)) 
df1_index_header = pd.MultiIndex.from_tuples(df1_index_tuple) 


df1 = pd.DataFrame(np.random.rand(2,2), columns = df1_column_header, index = df1_index_header) 
print(df1) 
      foo  bar 
       A   B 
one 1 0.755296 0.101329 
two 2 0.925653 0.587948 

df2_column_array = [['alpha', 'beta'], 
      ['C', 'D']] 
df2_column_tuple = list(zip(*df2_column_array))  
df2_column_header = pd.MultiIndex.from_tuples(df2_column_tuple) 

df2_index_array = [['three', 'four'], 
      ['3', '4']] 
df2_index_tuple = list(zip(*df2_index_array)) 
df2_index_header = pd.MultiIndex.from_tuples(df2_index_tuple) 


df2 = pd.DataFrame(np.random.rand(2,2), columns = df2_column_header, index = df2_index_header) 
print(df2) 
      alpha  beta 
       C   D 
three 3 0.751013 0.957824 
four 4 0.879353 0.045079 

私はこれらのデータフレームを生成するために結合したいと思います:

   foo  bar  alpha  beta 
       A   B   C   D 
one 1 0.755296 0.101329  NaN  NaN 
two 2 0.925653 0.587948  NaN  NaN 
three 3  NaN  NaN 0.751013 0.957824 
four 4  NaN  NaN 0.879353 0.045079 

私は連結をしようとすると、の順番をインデックスは保持されますが、カラムのインデックスは保持されません。

df_joined = pd.concat([df1,df2]) 
print(df_joined) 
      alpha  bar  beta  foo 
       C   B   D   A 
one 1  NaN 0.101329  NaN 0.755296 
two 2  NaN 0.587948  NaN 0.925653 
three 3 0.751013  NaN 0.957824  NaN 
four 4 0.879353  NaN 0.045079  NaN 

結合しようとすると、列の順序nsは保持されますが、インデックスではありません。

df_joined = df1.join(df2, how = 'outer') 
print(df_joined) 
       foo  bar  alpha  beta 
       A   B   C   D 
four 4  NaN  NaN 0.879353 0.045079 
one 1 0.755296 0.101329  NaN  NaN 
three 3  NaN  NaN 0.751013 0.957824 
two 2 0.925653 0.587948  NaN  NaN 

DataFramesを結合するとき、どのように列とインデックスの順序を保持できますか?

編集1: 注:これはサンプルデータです。私の現実の世界のデータにはソートするための便利なラベル(1,2,3,4など)がありません。

編集2: 私の現実世界のデータへのソリューションを提案して適用する場合、私は次のエラーを取得する:

Exception: cannot handle a non-unique multi-index! 

答えて

1

あなたがhack使用することができます - 最初の連結をし、二concatMultiindex、その後reindex出力が得られます。

idx = pd.concat([df1,df2]).index 
df_joined = pd.concat([df1,df2], axis=1).reindex(idx) 
print (df_joined) 
       foo  bar  alpha  beta 
       A   B   C   D 
one 0 0.269298 0.819375  NaN  NaN 
two 1 0.574702 0.798920  NaN  NaN 
three 3  NaN  NaN 0.436893 0.822041 
four 4  NaN  NaN 0.757332 0.271900 

MultiindexesDataFramesを作成して高速化ソリューション、それをCONCATとindexを取得:

idx = pd.concat([pd.DataFrame(df1.index, index=df1.index), 
       pd.DataFrame(df2.index, index=df2.index)]).index 
df_joined = pd.concat([df1,df2], axis=1).reindex(idx) 
print (df_joined) 
       foo  bar  alpha  beta 
       A   B   C   D 
one 0 0.007644 0.341335  NaN  NaN 
two 1 0.332005 0.449688  NaN  NaN 
three 3  NaN  NaN 0.281876 0.883299 
four 4  NaN  NaN 0.880252 0.061797 

EDIT1:ソリューションの

問題の前にあるreindexは、重複を嫌っています。列のMultiindexが重複していない場合 だから、あなたが使用することができます。

print(df1) 
      foo  bar 
       A   B 
one 0 0.384705 0.932928 
    0 0.539197 0.519196 

print(df2) 
      alpha  beta 
       C   D 
three 3 0.957530 0.985926 
four 4 0.479828 0.350042 

cols = df1.join(df2, how = 'outer').columns 
df_joined = pd.concat([df1,df2]).reindex(columns=cols) 
print (df_joined) 
       foo  bar  alpha  beta 
       A   B   C   D 
one 0 0.384705 0.932928  NaN  NaN 
     0 0.539197 0.519196  NaN  NaN 
three 3  NaN  NaN 0.957530 0.985926 
four 4  NaN  NaN 0.479828 0.350042 
+0

謝罪を明確にされていないために:これはサンプルデータである、私の実世界のデータは便利なラベルを持っていない(例えば1,2,3,4)並べ替える – BdB

+0

私はこの解決策を見つける、編集された答えを確認してください。 – jezrael

+0

それは素晴らしいです、ありがとう! – BdB