合并多个组id以形成一个合并的组id?

2024-06-16 09:10:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据集在熊猫数据帧。你知道吗

group_id sub_group_id
0           0  
0           1
1           0
2           0
2           1
2           2
3           0       
3           0 

但是我想把这些组id合并成一个统一的组id

group_id sub_group_id consolidated_group_id
0            0                    0
0            1                    1
1            0                    2
2            0                    3 
2            1                    4
2            2                    5
2            2                    5
3            0                    6
3            0                    6  

有什么通用的或数学的方法可以做到这一点吗?你知道吗


Tags: 数据方法idgroup数学consolidated
2条回答
cols = ['group_id', 'sub_group_id']
df.assign(
    consolidated_group_id=pd.factorize(
        pd.Series(list(zip(*df[cols].values.T.tolist())))
    )[0]
)

   group_id  sub_group_id  consolidated_group_id
0         0             0                      0
1         0             1                      1
2         1             0                      2
3         2             0                      3
4         2             1                      4
5         2             2                      5
6         3             0                      6
7         3             0                      6

您需要将值转换为tuples,然后使用^{}

df['consolidated_group_id'] = pd.factorize(df.apply(tuple,axis=1))[0]
print (df)

   group_id  sub_group_id  consolidated_group_id
0         0             0                      0
1         0             1                      1
2         1             0                      2
3         2             0                      3
4         2             1                      4
5         2             2                      5
6         3             0                      6
7         3             0                      6

Numpy解决方案有点修改this answer-通过[::-1]更改顺序,并通过[0]选择返回数组(^{}):

a = df.values

def unique_return_inverse_2D(a): # a is array
    a1D = a.dot(np.append((a.max(0)+1)[:0:-1].cumprod()[::-1],1))
    return np.unique(a1D, return_inverse=1)[::-1][0]


def unique_return_inverse_2D_viewbased(a): # a is array
    a = np.ascontiguousarray(a)
    void_dt = np.dtype((np.void, a.dtype.itemsize * np.prod(a.shape[1:])))
    return np.unique(a.view(void_dt).ravel(), return_inverse=1)[::-1][0]

df['consolidated_group_id'] = unique_return_inverse_2D(a)
df['consolidated_group_id1'] = unique_return_inverse_2D_viewbased(a)
print (df)
   group_id  sub_group_id  consolidated_group_id  consolidated_group_id1
0         0             0                      0                       0
1         0             1                      1                       1
2         1             0                      2                       2
3         2             0                      3                       3
4         2             1                      4                       4
5         2             2                      5                       5
6         3             0                      6                       6
7         3             0                      6                       6

相关问题 更多 >