在数据框列中剪切字符串,直到某些字符串但包括

时间:2019-04-10 22:51:48

标签: python regex pandas

我有以下相似的数据:

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 个答案:

答案 0 :(得分:2)

您想尝试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

答案 1 :(得分:1)

您需要做的就是在没有'details'的情况下在正则表达式中提供一个后备选项:

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

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