2016-05-13 4 views
1

私はインデックスとしてkeyを持つ2つのデータフレームdf1とdf2を持っています。インデックスごとに変動する行でpandasデータフレームを連結する

dict_1={'key':[1,1,1,2,2,3], 'col1':['a1','b1','c1','d1','e1','f1']} 
df1 = pd.DataFrame(dict_1).set_index('key') 
dict_2={'key':[1,1,2], 'col2':['a2','b2','c2']} 
df2 = pd.DataFrame(dict_2).set_index('key') 

DF1:

 col1 
key 
1  a1 
1  b1 
1  c1 
2  d1 
2  e1 
3  f1 

DF2

 col2 
key 
1  a2 
1  b2 
2  c2 

注意各インデックスの不等行が存在すること。私はこれらの2つのデータフレームを連結して、私は以下のデータフレーム(df3と言う)を持っています。

DF3

 col1 col2 
key 
1  a1 a2 
1  b1 b2 
2  d1 c2 

即ち各インデックスの行(DF1およびDF2の)以上のような新しいデータフレームように2つの列を連結します。

は私が

pd.concat([df1,df2],axis=1) 

を試してみましたが、私は次のエラーを取得する:

Value Error: Shape of passed values is (2,17), indices imply (2,7) 

私の質問:私はdf1df2をconcatentateするにはどうすればよいdf3を取得するには?代わりにDataFrame.mergeを使用する必要がありますか?もしそうなら、どうですか?

答えて

1

マージ/ジョイントだけでは、重複してしまうことがあります。しかし、ちょっとしたトリックが役立ちます。

df1['count1'] = 1 
df1['count1'] = df1['count1'].groupby(df1.index).cumsum() 
df1 
Out[198]: 
    col1 count1 
key    
1  a1  1 
1  b1  2 
1  c1  3 
2  d1  1 
2  e1  2 
3  f1  1 

df2についても同じこと:

df2['count2'] = 1 
df2['count2'] = df2['count2'].groupby(df2.index).cumsum() 

そして最後に:今

df_aligned = df1.reset_index().merge(df2.reset_index(), left_on = ['key','count1'], right_on = ['key', 'count2']) 
df_aligned 
Out[199]: 
    key col1 count1 col2 count2 
0 1 a1  1 a2  1 
1 1 b1  2 b2  2 
2 2 d1  1 c2  1 

を、あなたはset_index('key')とインデックスをリセットすることはできませんし、必要に応じて、もはやドロップ列countn

+0

「小さなトリック」をありがとう。それは私が理解できなかった欠けているリンクです。私はこれを答えとして受け入れます。 – Bhushan

+0

@Bhushan Glad私は助けることができました。 – ptrj

0

あなたが望むように2つの行を並べ替えることができない最大の問題は、キーが重複していることです。 df1のA2値とdf2のA1値をどのように整列させますか?A1、A2、B1、B2、およびC1のキーはすべて同じですか?

df3 = df1.merge(df2, left_index=True, right_index=True, how='inner') 

あなたはhowためinnerouterleftまたはrightを使用することができます。mergeを使用して

は、あなたが重要な問題を解決することができれば、あなたがたいと思うものです。

+0

重複キーは、データフレームの一部です。 'id1'はバッファIDのインデックスであり、 'col1'と 'col2'はバッファが取得され、解放されたときのタイムスタンプです。バッファは大規模な時間枠で取得/解放され、ptrjの答えはバッファが使用されている時間の長さを計算できるようにデータフレームを並べ替えるのに役立ちました。 – Bhushan

関連する問題