2016-11-07 11 views
1

を連結:パンダ - 次のように私はデータフレームを持っています2つのマルチインデックスデータフレーム

df.head() 
       Student Name   Q1 Q2 Q3 
Month Roll No    
2016-08-01 0 Save Mithil Vinay  0.0 0.0 0.0 
      1 Abraham Ancy Chandy  6.0 5.0 5.0 
      2 Barabde Pranjal Sanjiv 7.0 5.0 5.0 
      3 Bari Siddhesh Kishor 8.0 5.0 3.0 
      4 Barretto Cleon Domnic 1.0 5.0 4.0 

は、今私は、階層列のインデックスを作りたかったので、私はそれを次のように行った:

big_df = pd.concat([df['Student Name'], df[['Q1', 'Q2', 'Q3']]], axis=1, keys=['Name', 'IS']) 

し、以下を得ることができた:

>>> big_df 
       Name     IS 
       Student Name   Q1 Q2 Q3 
Month Roll No    
2016-08-01 0 Save Mithil Vinay  0.0 0.0 0.0 
      1 Abraham Ancy Chandy  6.0 5.0 5.0 
      2 Barabde Pranjal Sanjiv 7.0 5.0 5.0 
      3 Bari Siddhesh Kishor 8.0 5.0 3.0 
      4 Barretto Cleon Domnic 1.0 5.0 4.0 

今2回目の反復のために、私はを連結したいですは、新しいデータフレームからbig_dfデータフレーム(前に連結されたデータフレーム)までの値です。次のように今、2回目の反復のためのデータフレームは、次のとおりです。

   Student Name   Q1 Q2 Q3 
Month Roll No    
2016-08-01 0 Save Mithil Vinay  0.0 0.0 0.0 
      1 Abraham Ancy Chandy  8.0 5.0 5.0 
      2 Barabde Pranjal Sanjiv 7.0 5.0 4.0 
      3 Bari Siddhesh Kishor 8.0 4.0 3.0 
      4 Barretto Cleon Domnic 2.0 3.0 4.0 

私は次のようbig_dfを望んでいた:

   Name     IS   CC 
       Student Name   Q1 Q2 Q3 Q1 Q2 Q3 
Month Roll No        
2016-08-01 0 Save Mithil Vinay  0.0 0.0 0.0 0.0 0.0 0.0 
      1 Abraham Ancy Chandy  6.0 5.0 5.0 8.0 5.0 5.0 
      2 Barabde Pranjal Sanjiv 7.0 5.0 5.0 7.0 5.0 4.0 
      3 Bari Siddhesh Kishor 8.0 5.0 3.0 8.0 4.0 3.0 
      4 Barretto Cleon Domnic 1.0 5.0 4.0 2.0 3.0 4.0 

私は以下のコードを試してみましたが、すべてがエラーを与えている:

big_df.concat([df[['Q1', 'Q2', 'Q3']]], axis=1, keys=['CC']) 

pd.concat([big_df, df[['Q1', 'Q2', 'Q3']]], axis=1, keys=['Name', 'CC']) 

ここでエラーが発生していますか?親切に助けてください。私は

+2

と連結する前に、新しいマルチレベル(「CC」)を前に付加すべきですpd.read_clipboard()をコピーして使用するだけで、初期データを取得できます。それが動作することをテストする必要があります。また、データフレームを正確に取得するためにread_clipboard()または後処理行のいくつかの引数が必要であることを強調します。そうすれば、誰もが簡単に手助けすることができます。 –

+0

@JulienMarrecそれについては申し訳ありません...次回は改善します。サポートありがとう – Jeril

答えて

1

まず、インデックスを['Month', 'Roll no.', 'Student Name']に設定する方がよいでしょう。それはあなたのconcat構文を多く簡素化し、あなたも学生の名前に一致するようにします。

df.set_index('Student Name', append=True, inplace=True) 

第二に、私はあなたが違っそれを行うと、最も高い列レベルの名前を参照して、あなたの反復中(Q1/Q2/Q3値で)あなたのdfデータフレームを保存する提案(例えば、「は」 、 'CC')。だから今は、パンダはCONCAT場合

df_dict 

In [10]: df_dict 

Out[10]: 
{'CC':            Q1 Q2 Q3 
Month  Roll No Student Name       
2016-08-01 0  Save Mithil Vinay  0.0 0.0 0.0 
      1  Abraham Ancy Chandy  6.0 5.0 5.0 
      2  Barabde Pranjal Sanjiv 7.0 5.0 5.0 
      3  Bari Siddhesh Kisho  8.0 5.0 3.0 
      4  Barretto Cleon Domnic 1.0 5.0 4.0, 
'IS':            Q1 Q2 Q3 
Month  Roll No Student Name       
2016-08-01 0  Save Mithil Vinay  0.0 0.0 0.0 
      1  Abraham Ancy Chandy  8.0 5.0 5.0 
      2  Barabde Pranjal Sanjiv 7.0 5.0 4.0 
      3  Bari Siddhesh Kisho  8.0 4.0 3.0 
      4  Barretto Cleon Domnic 2.0 3.0 4.0} 

:dictのは、このために完璧になると、パンダはをループした後、今pd.concat

# Creating a dictionnary with the first df from your question 
df_dict = {'IS': df} 

# Iterate.... 
    # Append the new df to the df_dict 
    df_dict['CC'] = df 

に引数として辞書を受け入れず、ここにあなたの辞書ですそれはあなたのためにきれいに、そして自動的に行います。

In [11]: big_df = pd.concat(df_dict, axis=1) 
     big_df 

Out[11]: 

enter image description here


あなたが本当に繰り返し、それをやってみたかった場合は、あなたが質問を投稿するとき、あなたがどこに何かを持つあなたの質問をフォーマットする場合、それは素晴らしいだろうbig_df

df.columns = pd.MultiIndex.from_tuples([('IS', x) for x in df.columns]) 

# Then you can concat, give the same result as the picture above. 
pd.concat([big_df, df], axis=1) 
+0

助けてくれてありがとうございますが、「Student Name」が連結されています。 [Image1](https://i.imgsafe.org/08d67d6aff.png)および[Image2](https://i.imgsafe.org/08d93130b9.png)。 '学生名 'を削除するには? – Jeril

+1

私はあなたのインデックスを[月]、[ロールナンバー]、[学生名]のように設定しなければならないと言った部分を忘れてしまったと思います。 あなたのために: –

+0

の前に 'df.set_index( 'Student Name'、append = True、inplace = True)を実行する必要があります。 – Jeril

1

ドロップにbig_dfの最上位レベルをパンダに新しいです:

Q_cols = ['Q1', 'Q2', 'Q3'] 
key_names = ['Name', 'IS', 'CC'] 
pd.concat([big_df[['Student Name']], big_df[Q_cols], df[Q_cols]], axis=1, keys=key_names) 

Image

big_df.columns = big_df.columns.droplevel(level=0) 

は、彼らが使用するキーの数を入力整合として三つの異なるフレームを提供する連結します

+1

ありがとうございます。レベル0を落とす必要がありました。それが問題を作り出していました。 – Jeril

関連する問題