Отдельные столбцы с помощью регулярных выражений - PullRequest
1 голос
/ 23 января 2020

У меня есть DataFrame со столбцом под названием «Имя файла», который содержит длинные строки, которые мне нужно разбить на разные столбцы.

df = pd.DataFrame({'File Name':['92.00.88 / Z.89 / JK89Y3333 Test File Name', 
                                 '94.00.21 / W.22 / JK89Y3333 Sample Document Title Here', 
                                 '94.10.31 / Y.88 / JK89Y3333 File Document Name',
                                 'Phase 1',
                                 'Phase 2']}) 

| File Name                                              |
|--------------------------------------------------------|
| 92.00.88 / Z.89 / JK89Y3333 Test File Name             |
| 94.00.21 / W.22 / JK89Y3333 Sample Document Title Here |
| 94.10.31 / Y.88 / JK89Y3333 File Document Name         |
| Phase 1                                                |
| Phase 2                                                |

Вот как мне нужен DataFrame:

| File Number | Site | Barcode   | Title                      | Phase   |
|-------------|------|-----------|----------------------------|---------|
| 92.00.88    | Z.89 | JK89Y3333 | Test File Name             |         |
| 94.00.21    | W.22 | JK89Y3333 | Sample Document Title Here |         |
| 94.10.31    | Y.88 | JK89Y3333 | File Document Name         |         |
|             |      |           |                            | Phase 1 |
|             |      |           |                            | Phase 2 |

Не могу понять, как это сделать с помощью RegEx.

Ответы [ 2 ]

1 голос
/ 23 января 2020
df = df['File Name'].str.extract(r'(?P<File_Number>.*)\s/\s(?P<Site>.*)\s/\s(?P<Barcode>.*?)\s(?P<Tile>.*)|(?P<Phase>Phase.*)'). \
    fillna(''). \
    rename(columns={'File_Number':'File Number'})

print(df)

Отпечатки:

  File Number  Site    Barcode                        Tile    Phase
0    92.00.88  Z.89  JK89Y3333              Test File Name         
1    94.00.21  W.22  JK89Y3333  Sample Document Title Here         
2    94.10.31  Y.88  JK89Y3333          File Document Name         
3                                                           Phase 1
4                                                           Phase 2
1 голос
/ 23 января 2020

Мы можем использовать негативные и позитивные прогнозы для некоторого расширенного разделения:

data = df['File Name'].str.split('/|(?<=\d{3})\s(?=[A-Z])', expand=True)
df2 = pd.DataFrame(data.to_numpy(), columns=['File Number', 'Site', 'Barcode', 'Title'])

# clean up File Number column and create Phase columns
phase = df2['File Number'].str.contains('Phase')
df2.loc[phase, 'Phase'] = df2.loc[phase, 'File Number']
df2.loc[phase, 'File Number'] = ''
df2 = df2.replace(np.NaN, '')

  File Number    Site     Barcode                       Title    Phase
0   92.00.88    Z.89    JK89Y3333              Test File Name         
1   94.00.21    W.22    JK89Y3333  Sample Document Title Here         
2   94.10.31    Y.88    JK89Y3333          File Document Name         
3                                                              Phase 1
4                                                              Phase 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...