Python 如果左、右df';她的钥匙不同

Python 如果左、右df';她的钥匙不同,python,pandas,join,merge,Python,Pandas,Join,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 右图 0 1 2 3 4 5 0 1 2 3 4 5 6 1 1 2 3 4 5 7 2 2 3

我发现,若左键索引和右键索引不同,那个么熊猫合并方法的工作会很奇怪

例如,我定义了左数据帧和右数据帧,如下所示

   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
右图

   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_和right_的方式不同,结果会变得非常奇怪,如下所示

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