Разделите значения столбца на разделы и сохраните имя раздела в новом столбце pandas - PullRequest
1 голос
/ 14 июля 2020

У меня есть столбец с несколькими названиями продуктов, например

      Contract
0      O.U20
1      O.Z20
2      O.H21
3      O.M21
4      O.U21
5      O.Z21
6      O.H22
7      O.M22
8     S3.U20
9     S3.Z20
10    S6.M26
11    S6.U26
12    S6.Z26
13    S6.H27
14    S9.U26
15    S9.Z26
16    F3.U26
17    F3.Z26
18    F3.H27
19    F6.H26
20    F6.M26
21    F6.U26
22    F9.U20

Я хочу назначить имя раздела на основе имени контракта, например

   Contract Sections
0     O.U20      O1
1     O.Z20      O1
2     O.H21      O1
3     O.M21      O1
4     O.U21      O2
5     O.Z21      O2
6     O.H22      O2
7     O.M22      O2
8    S3.U20       S3
9    S3.Z20       S3
10   S6.M26       S6
11   S6.U26       S6
12   S6.Z26       S6
13   S6.H27       S6
14   S9.U26       S9
15   S9.Z26       S9
16   F3.U26       F3
17   F3.Z26       F3
18   F3.H27       F3
19   F6.H26       F6
20   F6.M26       F6
21   F6.U26       F6
22   F9.U20       F9

Для серий S и F I может достичь желаемых результатов с помощью этого кода (дайте мне знать, есть ли лучший способ добиться этого)

df.loc[df['Contract'].str.contains('S3'),'Sections'] = 'S3'
df.loc[df['Contract'].str.contains('S6'),'Sections'] = 'S6'
df.loc[df['Contract'].str.contains('S9'),'Sections'] = 'S9'
df.loc[df['Contract'].str.contains('F3'),'Sections'] = 'F3'
df.loc[df['Contract'].str.contains('F6'),'Sections'] = 'F6'
df.loc[df['Contract'].str.contains('F9'),'Sections'] = 'F9'

Так как он просто соответствует строке, назначающей имя раздела. К сожалению, серия O не имеет номера, поэтому я должен разделить ее на блоки по 4, как показано выше

   Contract Sections
0     O.U20      O1
1     O.Z20      O1
2     O.H21      O1
3     O.M21      O1
4     O.U21      O2
5     O.Z21      O2
6     O.H22      O2
7     O.M22      O2

Я пробовал следующий код

df.loc[df['Contract'].str.contains('O'),'Sections'] = df.index // 4+1

, но он бросает ошибка

ValueError: could not broadcast input array from shape (23) into shape (8)

Как я могу добиться результатов лучше и эффективнее? Обратите внимание, что это всего лишь образец данных, и в исходном наборе данных гораздо больше подобных значений.

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Чтобы упростить

df.loc[df['Contract'].str.contains('S3'),'Sections'] = 'S3'
df.loc[df['Contract'].str.contains('S6'),'Sections'] = 'S6'
df.loc[df['Contract'].str.contains('S9'),'Sections'] = 'S9'
df.loc[df['Contract'].str.contains('F3'),'Sections'] = 'F3'
df.loc[df['Contract'].str.contains('F6'),'Sections'] = 'F6'
df.loc[df['Contract'].str.contains('F9'),'Sections'] = 'F9'

, просто замените его на 1 строку кода ниже:

df['Section'] = df['Contract'].str.split('.').str[0]
1 голос
/ 14 июля 2020

Измените свой код на

df.loc[df['Contract'].str.contains('O'),'Sections'] = 'O' +((df['Contract'].str.contains('O').cumsum().sub(1)//4) + 1).astype(str)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...