在数据框中创建包含一系列数字的列 (python)

Creating a column with series of numbers in a dataframe (python)

我有以下 table (df):

ColumnA ColumnB Blocks Groups
B 32 1 A1
E 99 2 A1
I 76 3 A1
l 55 4 A1
m 27 5 A1
A 12 1 A2
F 123 2 A2
k 80 3 A2
m 27 4 A2
n 67 5 A2
C 44 1 A3
H 87 2 A3
J 231 3 A3
n 67 4 A3
o 34 5 A4
D 76 1 A4
G 65 2 A4

我想添加另一个附加列,其中包含基于组列的 ID 列表。对于 A1 组,它应该是 101,102,103,... A2 应该是 201, 202, 203,... 输出 table 应该如下所示:

ColumnA ColumnB Blocks Groups IDs
B 32 1 A1 101
E 99 2 A1 102
I 76 3 A1 103
l 55 4 A1 104
m 27 5 A1 105
A 12 1 A2 201
F 123 2 A2 202
k 80 3 A2 203
m 27 4 A2 204
n 67 5 A2 205
C 44 1 A3 301
H 87 2 A3 302
J 231 3 A3 303
n 67 4 A3 304
o 34 5 A4 401
D 76 1 A4 402
G 65 2 A4 403

到目前为止我尝试了什么?

n = 4
TGn = round(len(df)/n)
idx = set(df.index // TGn)
df['IDs'] = (((df.index // TGn) + 1) * 100) + df.groupby('Groups').cumcount() + 1

这与组名(A1、A2、A3、A4)不符。我该怎么做?

您可以使用str.slice(1)提取组号,并将其转换为整数类型:

df['IDs'] = df.groupby('Groups').cumcount() + df['Groups'].str.slice(1).astype('int64') * 100 + 1

如果组名在数字部分之前可能有多个字符,您可以使用str.replace:

df['IDs'] = df.groupby('Groups').cumcount() + df.Groups.str.replace(
    r'.*?(\d+)', r'', regex=True).astype('int64') * 100 + 1

尝试使用 ngroup 为每个组分配相同的 ID。我将它们设为 100,200,...等等` 然后我向它们添加了 cumcount() 结果。

x = df.groupby('Groups')
y = x.ngroup().add(1).mul(100)
z = x.cumcount()+1
df['IDs'] = y+z

df:

ColumnA ColumnB Blocks Groups IDs
0 B 32 1 A1 101
1 E 99 2 A1 102
2 I 76 3 A1 103
3 l 55 4 A1 104
4 m 27 5 A1 105
5 A 12 1 A2 201
6 F 123 2 A2 202
7 k 80 3 A2 203
8 m 27 4 A2 204
9 n 67 5 A2 205
10 C 44 1 A3 301
11 H 87 2 A3 302
12 J 231 3 A3 303
13 n 67 4 A3 304
14 o 34 5 A4 401
15 D 76 1 A4 402
16 G 65 2 A4 403

编辑: 您也可以从组(A1,A2 ....)中获取组号。我在写答案时没有检查。

df['IDs'] = (df.Groups.str.extract('(\d$)').astype(int).mul(100))[0] + df.groupby('Groups').cumcount()+1