Как сделать новые столбцы df, используя pandas, чтобы получить имена и значения столбцов, используя регулярные выражения? - PullRequest
3 голосов
/ 09 июля 2019

У меня есть такие столбцы:

**col_3**
MD01_TK336_AT000_PT01
MD01_TK336_AT000_PB250_PT03
MD01_TK336_AT025_PT01
MD01_TK336_AT000_TH005_PT01
MD01_TK336_AT000_SB250_PT01_BP04

внутри панды df.Обратите внимание, что другие столбцы в той же строке не должны быть забыты - они связаны друг с другом.Я хочу создать больше столбцов df, чтобы получить следующий результат:

**MD  TK    AT  PT   PB   SB   TH  BP**
01  336  000  01
01  336  000  03  250
01  336  025  01
01  336  000  01             01
01  336  000  01       250       04

, где несуществующие значения будут просто пустыми или ''.

Я пробовал использовать:

df.col_3.str.extractall(r'([A-Za-z]+)(\d+)')

но он дает что-то похожее на групповую структуру, а при развертывании не дает имен столбцов, основанных на символах.

Редактировать: на основе ответа Питера.

Starting with:

**col_2**
MD01_TK336_AT000_PT01
MD01_TK336_AT000_PT02

>>> col_2.str.extractall(r'([A-Za-z]+)(\d+)')

       0    1
   match
0  0      MD   01
   1      TK  336
   2      AT  000
   3      PT   01
1  0      MD   01
   1      TK  336
   2      AT  000
   3      PT   02

>>> col_2.str.extractall(r'([A-Za-z]+)(\d+)')
         .reset_index(level=1, drop=True)

     0    1
0   MD   01
0   TK  336
0   AT  000
0   PT   01
1   MD   01
1   TK  336
1   AT  000
1   PT   02

>>> col_2.str.extractall(r'([A-Za-z]+)(\d+)')
         .reset_index(level=1, drop=True)
         .set_index(0, append=True)

         1
   0
0  MD   01
   TK  336
   AT  000
   PT   01
1  MD   01
   TK  336
   AT  000
   PT   02

>>> col_2.str.extractall(r'([A-Za-z]+)(\d+)')
         .reset_index(level=1, drop=True)
         .set_index(0, append=True)
         .unstack()

      1
0    AT  MD   PB  PT   TK
0   000  01  NaN  01  336
1   000  01  NaN  02  336

1 Ответ

2 голосов
/ 09 июля 2019

На основании вашей попытки:

# Hard-code desired column order
cols = ['MD', 'TK', 'AT', 'PT', 'PB', 'SB', 'TH', 'BP']

res = (df.col_3
         .str.extractall(r'([A-Za-z]+)(\d+)')
         .reset_index(level=1, drop=True)
         .set_index(0, append=True)
         .unstack()
         .fillna(0))

res.columns = res.columns.droplevel(None)

res = res[cols]
del res.columns.name

res

0  MD   TK   AT  PT   PB   SB   TH  BP
0  01  336  000  01    0    0    0   0
1  01  336  000  03  250    0    0   0
2  01  336  025  01    0    0    0   0
3  01  336  000  01    0    0  005   0
4  01  336  000  01    0  250    0  04
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...