【问题标题】:How to get the base file name from the path in a Pandas DataFrame如何从 Pandas DataFrame 中的路径获取基本文件名
【发布时间】:2020-12-14 07:24:55
【问题描述】:

我有一个带有文件路径列的 DataFrame。

我想将其更改为仅文件名。

我的 DataFrame 看起来像:

df = pd.DataFrame({
    'Sr No': [18, 19, 20],
    'Email': ['Test@test.com', 'Test@test.com', 'Test@test.com'],
    'filename': [r'C:/Users\Test.csv', r'C:/Users\Test1.csv',
                 r'C:/Users\Test1.csv']
})
Sr No Email filename
18 Test@test.com C:/Users\Test.csv
19 Test@test.com C:/Users\Test1.csv
20 Test@test.com C:/Users\Test1.csv
  1. 文件名只能是 Test 和 Test1
  2. 只需要两次写Test@test.com一次用于Test.csv,另一次用于Test1.csv。

简而言之,我的输出应该如下所示:

df = pd.DataFrame({
    'Sr No': [18, 19, 20],
    'Email': ['Test@test.com', 'Test@test.com', 'Test@test.com'],
    'filename': ['Test', 'Test1', 'Test1']
})
Sr No Email filename
18 Test@test.com Test
19 Test@test.com Test1
20 Test@test.com Test1

我想用 python 和 pandas DataFrame 来做。

“文件名”列中有 100 行。

我尝试使用:

import os

import glob

myfile = os.path.basename('C:/Users/Test.csv')
os.path.splitext(myfile)
print(os.path.splitext(myfile)[0])

但它只对一个路径有用,如何将它应用到整个列?

【问题讨论】:

    标签: python pandas dataframe data-science


    【解决方案1】:

    使用 apply 函数来迭代所有列并获得分配给新列的函数输出 (pd.Series)

    df["filename"] = df["filename"].apply(os.path.basename)
    

    df["filename"] = df["filename"].apply(lambda path: os.path.basename(path))
    

    例子:

    >>> df
       Sr No          Email            filename
    0     18  Test@test.com   C:/Users\Test.csv
    1     19  Test@test.com  C:/Users\Test1.csv
    2     20  Test@test.com  C:/Users\Test1.csv
    >>> df["filename"] = df["filename"].apply(os.path.basename)
    >>> df
       Sr No          Email   filename
    0     18  Test@test.com   Test.csv
    1     19  Test@test.com  Test1.csv
    2     20  Test@test.com  Test1.csv
    

    【讨论】:

      【解决方案2】:

      您需要通过重新定义来修改现有列。先用 pandas 读一下:

      import pandas as pd
      df = pd.read_csv('file_path\file_name.csv')
      df['filename'] = df['filename'].map(lambda x: x.split('\\')[-1][:-4])
      df = df.drop_duplicates()
      

      这会产生作为数据框的预期结果,因此您所缺少的只是将其保存回 csv/excel:

      df.to_excel('file_path\new_file_name.xlsx')
      

      或 csv:

      df.to_csv('file_path\new_file_name.csv')
      

      【讨论】:

        【解决方案3】:

        使用

        将excel文件读入pandas数据框
        import pandas as pd
        df = pd.read_excel("your excel file location")
        

        然后使用apply函数对整列进行一次操作如下

        def get_filename(path):
            temp_str = path.split('/')
            return temp_str[-1]
        
        df["filename"] = df["filename"].apply(get_filename)
        

        【讨论】:

          【解决方案4】:

          除了上面的答案,你还可以使用字符串方法:

          df['filename'] = df['filename'].str.split('/')[-1]
          

          不确定哪个最快。

          【讨论】:

          • 然后,您需要在拥有数据框后检查列名。它可能被称为其他名称,我们只会使用您在上面提供的列名称。
          【解决方案5】:

          假设您在给定的文件名列中有固定长度的目录:

          # created dataframe for example
          df = pd.DataFrame({'Email':['test@gmail.com','test@gmail.com','test@gmail.com'],
                             'filename':['c:/users\test.csv','c:/users\test1.csv','c:/users\test1.csv']} )   # dataframe
          
          # will create new column with file name only
          df['only_filename'] = [(path.encode('unicode_escape')[9:]).decode("utf-8") for path in df['filename']]
           
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-10
            • 2011-07-15
            • 1970-01-01
            • 1970-01-01
            • 2014-12-21
            • 2015-03-19
            • 2011-11-16
            • 1970-01-01
            相关资源
            最近更新 更多