Вырезать строку в столбце данных до определенной строки, но в том числе - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть данные, подобные следующим:

df = pd.DataFrame({'pagePath':['/my/retour/details/n8hWu7iWtuRXzSvDvCAUZRAlPda6LM/', 
                               '/my/orders/details/151726/', 
                               '/my/retours/retourmethod/']})
print(df)
                                            pagePath
0  /my/retour/details/n8hWu7iWtuRXzSvDvCAUZRAlPda...
1                         /my/orders/details/151726/
2                          /my/retours/retourmethod/

Что я хочу сделать, это обрезать строку до (но в том числе) details

Ожидаемый результат

                    pagePath
0  /my/retour/details/
1  /my/orders/details/
2  /my/retours/retourmethod/

Следующее работает , но медленно

df['pagePath'] = np.where(df.pagePath.str.contains('details'),
                          df.pagePath.apply(lambda x: x[0:x.find('details')+8]), 
                          df.pagePath)

print(df)

                    pagePath
0        /my/retour/details/
1        /my/orders/details/
2  /my/retours/retourmethod/

Я попробовал регулярное выражение , но смог заставить его работать только , исключая :

df['pagePath'] = np.where(df.pagePath.str.contains('details'),
                          df.pagePath.str.extract('(.+?(?=details))'), 
                          df.pagePath)

print(df)
      pagePath
0  /my/retour/
1  /my/orders/
2          NaN

Плюс код регулярного выражения возвращает NaN, когда строка не содержит details

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

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Все, что вам нужно сделать, это предоставить запасной вариант в регулярном выражении, когда нет 'details':

>>> df.pagePath.str.extract('(.+?details/?|.*)')

                           0
0        /my/retour/details/
1        /my/orders/details/
2  /my/retours/retourmethod/
2 голосов
/ 11 апреля 2019

Хотите попробовать str.extract

('/'+df.pagePath.str.extract('/(.*)details')+'details')[0].fillna(df.pagePath)
Out[130]: 
0           /my/retour/details
1           /my/orders/details
2    /my/retours/retourmethod/
Name: 0, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...