加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 如果左右df的键不同,pandas merge会做奇怪的工作

发布时间:2020-12-20 13:16:41 所属栏目:Python 来源:网络整理
导读:我发现如果左右键的索引不同,pandas merge方法会很奇怪. 例如,我定义左右数据帧如下 left_df 0 1 2 3 4 50 1 2 1 2 3 41 2 3 2 3 4 52 1 2 3 4 5 63 2 2 4 5 6 74 2 3 5 6 7 8 right_df 0 1 2 3 4 50 1 2 3 4 5 61 1 2 3 4 5 72 2 3 4 5 6 73 2 3 4 5 6 8 并
我发现如果左右键的索引不同,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,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 params不同,结果会变得非常奇怪,如下所示.

merge job with '1,2' left key index

pd.merge(left_df,left_on = [1,2],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.)

有什么参数或方法可以解决上面奇怪的工作吗?

解决方法

我想知道我提到的奇怪结果的情况,所以我把自己的假设分成两个案例.

>每个键的列名不同时
>当每个键的列索引(在这种情况下,数据帧中的绝对列位置.)不同时

通过一些测试用例,我可以弄清楚当每个键的列名不同时,结果不太好.

所以这个问题可以很容易地处理chaning列名.

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,key_entry):
            left_rename_map[i] = each

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

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

在我看来,Pandas尝试保存所有列信息(在本例中为列名).因此,如果键的列名不同,Pandas认为该列不相同,并且虽然每个值都与列相同,但它不会删除键列.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读