熊猫根据其他列的值创建新的列ID

RRA:

我是编程和熊猫的新手。因此,请不要做出严格的判断,对不起我的解释。

我基本上有两个列(DM1_ID,DM2_ID),并且我需要基于这两列值创建一个新列('NewID')。基本上,我正在为这两列创建一个新的ID。在这里,首先评估第一列中的值,然后获取该值并将其放入“ NewID”列中。另外,当我们这样做时,需要考虑DM2_ID,并且当该ID出现在DM1_ID中时,我需要在NewID列中提供相同的DM1_ID。

例如,在0的索引中,DM1_ID为1和DM2_ID为6,我需要将1作为两个ID的NewID。当DM1_ID达到6(索引15)时,无论在DM2_ID中是什么,我都必须给1作为NewID,因为我同时给了DM1_ID 1和DM1_ID6。所以它将是1。此外,我需要考虑DM2_ID以供以后使用和它也将是1。(索引15 DM1_ID 6和DM​​2_ID 45,因为我已经为1和6都将newId设置为1,所以我必须为DM1_ID 6设置为1。同样对于45,我需要给1作为NewID(索引21)。)

#I have a large table like this
    DM1_ID  DM2_ID
0   1       6
1   1       7
2   1       15
3   2       5
4   2       10
5   3       21
6   3       28
7   3       32
8   3       35
9   4       39
10  5       2
11  5       10
12  6       1
13  6       7
14  6       15
15  6       45
16  6       55
17  7       1
18  7       6
19  7       15
20  10      75
21  45      120

#I need to create this table

    DM1_ID  DM2_ID  abc
0   1       6        1
1   1       7        1
2   1       15       1
3   2       5        2
4   2       10       2
5   3       21       3
6   3       28       3
7   3       32       3
8   3       35       3
9   4       39       4
10  5       2        2
11  5       10       2
12  6       1        1
13  6       7        1
14  6       15       1
15  6       45       1
16  6       55       1
17  7       1        1
18  7       6        1
19  7       15       1
20  10      75       2
21  45      120      1

Any help would be appreciated. Thanks.


机灵的:

实现目标的一种方法是先保留您的ID。然后,一旦满足条件,您就可以使用此持久化映射表/词典来分配唯一ID。我在字典中提供了一个示例,如下所示,但是您也可以使用数据库或JSON文件来持久存储给定的ID:

df['pairs'] = df.apply(lambda x: [x[0], x[1]], axis=1)
pairs = df['pairs'].tolist()

u = {}
u_ = {}
for p in pairs:
    if u:
        if not u_:
            u_ = u.copy()
        else:
            u = u_.copy()
           
        for k in list(u.keys()):
            if any(x in u[k] for x in p):
                u_.update(
                    {
                        k: list(set(u[k] + p))
                    }
                )
                
            else:
                pass
            
        vals = [j for i in list(u.values()) for j in i]
        if u == u_ and not any(x in vals for x in p):
            n = max(list(u_.keys())) + 1
            u_[n] = p

        else:
            pass
            
    else:
        u[1] = p
        
u_

输出:

{1: [1, 6, 7, 45, 15, 55, 120],
 2: [75, 2, 10, 5],
 3: [32, 35, 3, 21, 28],
 4: [4, 39]}

现在让我们应用一个函数,该函数根据在上一步中创建的字典为每行分配新的ID:

f = lambda x: next(k for k,v in u_.items() if any(i in v for i in x))
df['new_ID'] = df['pairs'].apply(f)
df.drop('pairs', axis=1, inplace=True)
df

输出:

DM1_ID  DM2_ID  new_ID
0   1   6   1
1   1   7   1
2   1   15  1
3   2   5   2
4   2   10  2
5   3   21  3
6   3   28  3
7   3   32  3
8   3   35  3
9   4   39  4
10  5   2   2
11  5   10  2
12  6   1   1
13  6   7   1
14  6   15  1
15  6   45  1
16  6   55  1
17  7   1   1
18  7   6   1
19  7   15  1
20  10  75  2
21  45  120 1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章