7

关于字符串操作有几个问题,但我找不到允许我执行以下操作的答案 - 我认为它应该很简单......

我有一个 DataFrame,其中包含一个包含文件名和路径的列

下面产生一个有代表性的示例DataFrame:

df = pd.DataFrame({
    'root': {'1': 'C:\\folder1\\folder2\\folder3\\folder4\\filename.csv'}
})
                                              root
1  C:\folder1\folder2\folder3\folder4\filename.csv

我想以字符串的“文件名”部分结尾。行数较多,路径不固定,无法使用str.replace

我可以像这样去掉最右边的“.csv”部分:

df['root'] = df['root'].str.rstrip('.csv') 
                                          root
1  C:\folder1\folder2\folder3\folder4\filename

但是我无法使用我读过的任何方法来删除字符串左侧的路径部分。

鉴于路径的前面元素可以从记录更改为记录,我如何仅返回此路径(字符串)的“文件名”部分?

4

4 回答 4

9

您可以使用实用程序os.path使这更容易,即splitextbasename

>>> import os
>>> df["root"].apply(lambda x: os.path.splitext(os.path.basename(x))[0])
0    filename
Name: root, dtype: object

PS:rstrip不像你想象的那样工作——它删除了那些字符,而不是那个子字符串。例如:

>>> "a11_vsc.csv".rstrip(".csv")
'a11_'
于 2014-08-16T21:50:06.657 回答
3

对于最近的 Python,推荐使用pathlib。basename可以通过.stem如下申请获得。一般来说,DataFrames 经常有多行,所以下面的例子也使用了 pandas .apply

from pathlib import Path 

df['root'].apply(lambda x: Path(x).stem)
# Out[1]:
# 1    filename
# Name: root, dtype: object

如果你想包含扩展,你可以通过申请来获得它.name

df['root'].apply(lambda x: Path(x).name)
# Out[2]:
# 1    filename.csv
# Name: root, dtype: object
于 2020-01-31T02:25:59.877 回答
2

假设路径中总是至少有一个深度,我们可以在斜杠上分割,取最后一个元素,然后在其上调用 rstrip:

In [9]:

df.root.str.split('\\').str[-1].str.rstrip('.csv')
Out[9]:
1    filename
Name: root, dtype: object

根据 DSM 对rstrip的指出进行编辑,您可以调用 split 两次:

In [11]:

df.root.str.split('\\').str[-1].str.split('.').str[0]
Out[11]:
1    filename
Name: root, dtype: object
于 2014-08-16T21:47:40.420 回答
1

对此没有任何熊猫特定的内容,它是os.path的基本路径处理。

其次,Windows/DOS 接受 / 作为路径分隔符至少 10-15 年了。所以你可以而且应该写mypath = 'C:/folder1/folder2/folder3/folder4/filename.csv' 正如你所注意到的,使用反斜杠会使你的字符串处理变得困难,因为它必须被转义,并导致更糟糕的代码。定义os.sep = r'\\'似乎不起作用。

import os
os.path.basename(r'C:/folder1/folder2/folder3/folder4/filename.csv')
'filename.csv'

现在,如果你真的想坚持在你的 Python 中编写特定于操作系统的代码(尽管根本没有理由这样做),你可以使用鲜为人知的特定于平台的 os.path 版本:

import ntpath  # Windows/DOS-specific versions of os.path
ntpath.basename(r'C:\folder1\folder2\folder3\folder4\filename.csv')
'filename.csv'
于 2014-08-16T22:12:07.990 回答