2017-03-15 10 views
4

左右のキーインデックスが異なると、pandas mergeメソッドが奇妙な仕事をすることがわかりました。インスタンスの左右のdfのキーが違うと、pandas mergeが変な仕事をする

、私は

0 1 2 3 4 5 
0 1 2 1 2 3 4 
1 2 3 2 3 4 5 
2 1 2 3 4 5 6 
3 2 2 4 5 6 7 
4 2 3 5 6 7 8 

right_df

0 1 2 3 4 5 
0 1 2 3 4 5 6 
1 1 2 3 4 5 7 
2 2 3 4 5 6 7 
3 2 3 4 5 6 8 

といくつかのパラメータでジョブをマージ行い、

pd.merge(left_df, right_df, how="inner", left_on = [0,1], right_on=[0,1], indicator=False) 
left_df

に従うよう左右のデータフレームを定義します

結果は期待どおりに検索されます。

 0 1 2_x 3_x 4_x 5_x 2_y 3_y 4_y 5_y 
    0 1 2 1 2 3 4 3 4 5 6 
    1 1 2 1 2 3 4 3 4 5 7 
    2 1 2 3 4 5 6 3 4 5 6 
    3 1 2 3 4 5 6 3 4 5 7 
    4 2 3 2 3 4 5 4 5 6 7 
    5 2 3 2 3 4 5 4 5 6 8 
    6 2 3 5 6 7 8 4 5 6 7 
    7 2 3 5 6 7 8 4 5 6 8 

しかしleft_onとright_onのパラメータを別に設定すると、結果は以下のように非常に奇妙になります。

merge job with '1,2' left key index 

pd.merge(left_df, right_df, how="inner", left_on = [1,2], right_on=[0,1], indicator=False) 


    1 2 0_x 1_x 2_x 3_x 4_x 5_x 0_y 1_y 2_y 3_y 4_y 5_y 
0 2 3 1 2 3 4 5 6 2 3 4 5 6 7 
1 2 3 1 2 3 4 5 6 2 3 4 5 6 8 

       ^^    ^^
       these columns are duplicated. 

    0_x 1 2 3_x 4_x 5_x 2_y 3_y 4_y 5_y 
0 1 2 3 4 5 6 4 5 6 7 
1 1 2 3 4 5 6 4 5 6 8 
this is what I expected. (keys of each df are removed.) 

上記の奇妙な仕事を解決するためのパラメータや方法はありますか?

答えて

0

私は奇妙な結果が出たという条件を疑問に思った。だから私は自分の仮定を2つの場合に分ける。

  • 各キーの列名が異なる
  • (この場合には、データフレーム内の絶対的な列の位置。)列インデックス各キーのいくつかにより

異なりますテストケース、私は把握することができます各キーの列名が異なる場合、結果があまり良くありません。

この問題は、列名を変更することで簡単に処理できます。

left_df 
    0 key0 key1 3 4 5 
0 1  2  1 2 3 4 
1 2  3  2 3 4 5 
2 1  2  3 4 5 6 
3 2  2  4 5 6 7 
4 2  3  5 6 7 8 

right_df 
    key0 key1 2 3 4 5 
0  1  2 3 4 5 6 
1  1  2 3 4 5 7 
2  2  3 4 5 6 7 
3  2  3 4 5 6 8 

result 
    0 key0 key1 3_x 4_x 5_x 2 3_y 4_y 5_y 
0 1  2  3 4 5 6 4 5 6 7 
1 1  2  3 4 5 6 4 5 6 8 

以下は単純なコードの実装です。

 key_entry = [] 
     for i in range(len([1,2])): 
      key_entry.append('key' + str(i)) 

     left_rename_map = {} 
     for i, each in zip([1,2], key_entry): 
      left_rename_map[i] = each 

     right_rename_map = {} 
     for i, each in zip([0,1], key_entry): 
      right_rename_map[i] = each 

     df1 = df1.rename(columns=left_rename_map) 
     df2 = df2.rename(columns=right_rename_map) 

私の意見では、Pandasはすべての列情報(この場合は列名)を保存しようとします。したがって、キーの列名が異なる場合、Pandasは列が同じではなく、すべての値が同じであるにもかかわらずキー列を削除しないと考えます。