在数据框中创建包含一系列数字的列 (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
我有以下 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