pandas 如何按组将序列号放入数据框中

x6h2sr28  于 2023-04-04  发布在  其他
关注(0)|答案(3)|浏览(159)

下面有一个数据框,其中有一个模型和一个项作为列

df = pd.DataFrame({'model':['A','A','A','A','A','A','A','B','B','B','B','B','B','B'],
       'item':['aa','ab','ab','ab','ac','ad','ad','ba','ba','ba','bb','bb','bb','bc']})

我想在此数据框中添加一个串行列,但有一些规则
1.当型号(A,B)发生变化时,序列号将重置,并从零开始。
1.序列号不能超过3。
仅0、1、2个值
在二(2)之后,它从零(0)开始
1.在同一个项目的情况下,序列是相同的
我想要的是

2j4z5cfb

2j4z5cfb1#

您希望pd.factorize位于每个model组(groupby)中的item上。重置部分仅为一个模:

df['serial'] = df.groupby(['model'])['item'].transform(lambda x: pd.factorize(x)[0]) % 3

输出:

model item  serial
0      A   aa       0
1      A   ab       1
2      A   ab       1
3      A   ab       1
4      A   ac       2
5      A   ad       0
6      A   ad       0
7      B   ba       0
8      B   ba       0
9      B   ba       0
10     B   bb       1
11     B   bb       1
12     B   bb       1
13     B   bc       2
cyvaqqii

cyvaqqii2#

将每一项与前一项进行比较,并应用一个累计和。剩下的是一个数学运算,以调整到您期望的输出(计数从0开始,不超过3)

to_serial = lambda x: x.ne(x.shift()).cumsum().sub(1).mod(3)
df['serial'] = df.groupby('model')['item'].transform(to_serial)
print(df)

# Output
   model item  serial
0      A   aa       0
1      A   ab       1
2      A   ab       1
3      A   ab       1
4      A   ac       2
5      A   ad       0
6      A   ad       0
7      B   ba       0
8      B   ba       0
9      B   ba       0
10     B   bb       1
11     B   bb       1
12     B   bb       1
13     B   bc       2
qzlgjiam

qzlgjiam3#

如果需要按item中的连续值计数,请使用用途:

df['serial'] = (df['item'].ne(df['item'].shift()).cumsum()
                          .groupby(df['model'])
                          .rank(method='dense').astype(int).sub(1).mod(3))

或者:
x一个一个一个一个x一个一个二个x

相关问题