通过python使用多组的ngroup

2024-06-10 06:52:09 发布

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

给定一个DataFrame,我想要一列id1中的值的组号,在第二列id2的每个组中

我试图通过{}和{}来识别唯一的数字组

下面是一个例子df

    id1  id2
0  1123  123
1  1123  123
2  1124  123
3  1124  123
4  1125  123
5  1125  123
6  1125  123
7  1126  122
8  1126  122
9  1127  122

使用ngroup()

df['row_id'] = df.groupby(['id1','id2']).ngroup() + 1

但它给了我这个输出:

row_id = [1, 1, 2, 2, 3, 3, 3, 4, 4, 5]

我希望最后3个值在1处重新开始,因为它们用于新的id2(122);因此,我期望的输出是:

row_id = [1, 1, 2, 2, 3, 3, 3, 1, 1, 2]
#                              ^ restart (id2 switches from 123 to 122)

Tags: fromiddataframedf数字例子rowrestart
1条回答
网友
1楼 · 发布于 2024-06-10 06:52:09

由于您似乎希望在每个id2组中有一组数量的id1,因此您需要做的是两个.groupby()操作(每个组中有一个groupby):

# reproducible (copy/paste) setup
df = pd.DataFrame({
    'id1': [1123, 1123, 1124, 1124, 1125, 1125, 1125, 1126, 1126, 1127],
    'id2': [123, 123, 123, 123, 123, 123, 123, 122, 122, 122]})

out = df.assign(
    row_id=df
    .groupby('id2', group_keys=False)
    .apply(lambda g: g.groupby('id1').ngroup()) + 1)

给出:

>>> out
    id1  id2  row_id
0  1123  123       1
1  1123  123       1
2  1124  123       2
3  1124  123       2
4  1125  123       3
5  1125  123       3
6  1125  123       3
7  1126  122       1
8  1126  122       1
9  1127  122       2

注意:这将处理df未排序的情况:

>>> df = df.sample(frac=1)
>>> df
    id1  id2
8  1126  122
2  1124  123
6  1125  123
5  1125  123
7  1126  122
1  1123  123
3  1124  123
9  1127  122
4  1125  123
0  1123  123

以及:

out = df.assign(
    row_id=df
    .groupby('id2', group_keys=False)
    .apply(lambda g: g.groupby('id1').ngroup()) + 1)

给出:

>>> out
    id1  id2  row_id
8  1126  122       1
2  1124  123       1
6  1125  123       2
5  1125  123       2
7  1126  122       1
1  1123  123       3
3  1124  123       1
9  1127  122       2
4  1125  123       2
0  1123  123       3

相关问题 更多 >