如何从 Pandas DataFrame 中的路径获取基本文件名

Posted

技术标签:

【中文标题】如何从 Pandas DataFrame 中的路径获取基本文件名【英文标题】:How to get the base file name from the path in a 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
    文件名只能是 Test 和 Test1 只需要两次写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])

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

【问题讨论】:

【参考方案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']]
 

【讨论】:

以上是关于如何从 Pandas DataFrame 中的路径获取基本文件名的主要内容,如果未能解决你的问题,请参考以下文章

如何从列类型列表中删除 pandas DataFrame 中的空值

如何从 Python Pandas DataFrame 中的循环结果中删除重复项?

如何从 Python Pandas Dataframe 中的 STRING 列中提取嵌套字典?

如何摆脱从 CSV 文件读取的 pandas DataFrame 中的“未命名:0”列?

从 pandas DataFrame 制作热图

如何使用从 python 中的 DataFrame 生成的结果写入 csv?