Извлечение чисел из столбца в Pandas DataFrame с использованием pd.series.str.extractall против re.findall - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть следующий столбец в панде df:

| Primary_key |
|-------------|
| LIT1-1.10_t |
| LIT1-1.20_t |
| LIT1-1.30_t |
| LIT4-1.99_t | 
| LIT4-1.88_t |  
| LIT4-1.77_t | 

Я хочу извлечь номер версии из 'Primary_key' (String); разделите его на номер версии и идентификатор и поместите их в новые столбцы, чтобы получить следующий вывод:

| Primary_key  | version_nr | ID |
|--------------|------------|----|
| LIT1-1.10_t  | 1          |10  |
| LIT1-1.20_t  | 1          |20  |
| LIT1-1.30_t  | 1          |30  |
| LIT4-1.999_t | 4          |999 |
| LIT4-1.888_t | 4          |888 |
| LIT4-1.777_t | 4          |777 |

Я думаю, pandas.Series.str.extractall может быть решением для моей задачи, но у меня есть проблемы, чтобы правильно применить Я старался df['ID'] = df['Primary_Key'].str.extractall(r'(\d{3})').unstack().apply(','.join, 1), чтобы извлечь все числа в один столбец ('ID'), чтобы разделить их на следующем шаге. Но с этим кодом я получаю только последние три цифры:

| Primary_key  | ID |
|--------------|----|
| LIT1-1.10_t  |Nan |
| LIT1-1.20_t  |Nan |
| LIT1-1.30_t  |Nan |
| LIT4-1.999_t |999 |
| LIT4-1.888_t |888 |
| LIT4-1.777_t |777 |

Надеюсь, у одного из вас опытных программистов есть идея, как решить эту проблему:)

PS: Я также попробовал регулярное выражение re.findall('\d+',...), но я думаю, что это не совсем колени пчелы.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Да, str.extract с именованными группами захвата должно это сделать.

v = df.Primary_key.str.extract(r'(?P<version_nr>\d+).(?P<ID>\d+)_', expand=True)

Для обновления df,

df = pd.concat([df, v], axis=1)

df
   Primary_key version_nr  ID
0  LIT1-1.10_t          1  10
1  LIT1-1.20_t          1  20
2  LIT1-1.30_t          1  30
3  LIT4-1.99_t          1  99
4  LIT4-1.88_t          1  88
5  LIT4-1.77_t          1  77
0 голосов
/ 30 апреля 2018

Использование Регулярное выражение:

демо

import pandas as pd
df = pd.DataFrame({"Primary_key" : ["LIT1-1.10_t", "LIT1-1.20_t", "LIT4-1.77_t"]})
df["version_nr"] = df["Primary_key"].str.extract(r"\-(\d+)")
df["ID"] = df["Primary_key"].str.extract(r"\.(\d+)", )
print(df)

Выход:

   Primary_key version_nr  ID
0  LIT1-1.10_t          1  10
1  LIT1-1.20_t          1  20
2  LIT4-1.77_t          1  77
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...