Извлечение чисел в датафрейме строк на основе одного критерия в Python - PullRequest
0 голосов
/ 04 марта 2019

Я хочу извлечь все цифры перед символами ->.На данный момент у меня есть только это:

df['New'] = df['Companies'].str.findall(r'(\d+(?:\.\d+)?)').str[-1]

, который извлекает только числа перед последним ->

Я немного изменил это значение так:

df['New'] = df['Companies'].str.findall(r'(\d+(?:\.\d+)?)')

, ноЯ не получил то, что хотел, вместо этого я хочу что-то похожее на это:

       Companies                                        New   New2   New3
0   -> Company A 100->Company B 60->Company C 80->...   100   60     80
1   -> Company A 100->Company B 53.1->Company C 82...   100   53.1   82
2   -> Company A 100->Company B 23-> Company D          100   23
3   -> Company 1 100->Company B 30-> Company D          100   30

Обратите внимание, что New's может содержать более 3 столбцов в зависимости от количества -> в строках.,Кроме того, некоторые имена Company имеют целые числа в именах, которые я не хочу включать в новые столбцы.

Не могли бы вы помочь мне с этим?

1 Ответ

0 голосов
/ 04 марта 2019

Используйте Series.str.extractall с Series.unstack и DataFrame.add_prefix с целым числом перехвата или float с до ->:

pat = r'(\d*\.\d+|\d+\.?)->'
df = df.join(df['Companies'].str.extractall(pat)[0].unstack().add_prefix('New'))

print (df)
                                           Companies New0  New1 New2
0   -> Company A 100->Company B 60->Company C 80->    100    60   80
1   -> Company A 100->Company B 53.1->Company C 82    100  53.1  NaN
2   -> Company A 100->Company B 23-> Company D   ...  100    23  NaN
3         -> Company 1 100->Company B 30-> Company D  100    30  NaN

При необходимости плавает:

df = df.join(df['Companies'].str.extractall(pat)[0].astype(float).unstack().add_prefix('New'))
print (df)
                                           Companies   New0  New1  New2
0   -> Company A 100->Company B 60->Company C 80->    100.0  60.0  80.0
1   -> Company A 100->Company B 53.1->Company C 82    100.0  53.1   NaN
2   -> Company A 100->Company B 23-> Company D   ...  100.0  23.0   NaN
3         -> Company 1 100->Company B 30-> Company D  100.0  30.0   NaN
...