熊猫合并做奇怪的工作,如果左右DF的键不同



我发现pandas Merge方法如果左右的键索引不同。

对于实例,我将左右数据框架定义为以下内容

left_df

   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)

结果是按预期找到的。

       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.)

是否有任何参数或方法可以解决怪异的工作?

我想知道发生了我提到的怪异结果的条件,因此我将自己的假设分为两种情况。

  • 当每个键的列名不同
  • 当列索引(在这种情况下,在数据框架中的绝对列位置。)每个键的绝对列位置。

在某些测试用例中,我可以找出当每个键的列名不同时,结果不是很好。

因此,可以轻松处理此问题的名称。

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认为列不同,并且尽管每个值都相同,但它不会删除键列。