【问题标题】:How to extract base path from DataFrame column of path strings如何从路径字符串的DataFrame列中提取基本路径
【发布时间】:2014-10-10 05:50:00
【问题描述】:

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

我有一个 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

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

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

【问题讨论】:

  • 根据文件名的形式,DSM 的答案更可靠,但如果我所做的假设是真的,我希望基于 str 的方法在矢量化时会更快跨度>
  • 谢谢,EdChum,这么快就回答了,真的很有帮助。很难知道要选择哪个答案,但我认为您在 DSM 的答案中承认的稳健性,以及有关 rstrip 的额外信息提示了规模......不过,感谢您的帮助。
  • 您可以随时为多个答案投票,因为您可以接受一个

标签: python pandas string os.path


【解决方案1】:

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

In [9]:

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

EDIT 根据 DSM 对 rstrip 的指出,您可以调用 split 两次:

In [11]:

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

【讨论】:

    【解决方案2】:

    您可以使用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_'
    

    【讨论】:

    • 这是有效的,完全符合我的要求。非常感谢您的帮助以及额外的信息参考 rstrip
    【解决方案3】:

    pandas 对此并没有什么特别之处,它是os.path 的基本路径处理。

    第二,Windows/DOS has been accepting / as a path separator for at least 10-15 years now。所以你可以而且应该写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'
    

    【讨论】:

    • 直到上一个答案我才知道 os.path ——我认为这是熊猫问题,因为我正在处理熊猫数据框。我也不知道正斜杠作为分隔符是可以接受的——只是从来没有理由考虑它。我不完全确定我是否理解您的建议的用法:'os.path.basename(r'C:/folder1/folder2/folder3/folder4/filename.csv'),但我的数据中的实际路径变化,并且是读取大量 csv 文件的结果——我无法说明路径。我不确定这是否是你的意思。无论如何,感谢您提供有用的信息。 '
    【解决方案4】:

    对于最近的 Python,推荐使用pathlib。可以通过应用.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2018-08-13
      相关资源
      最近更新 更多