如何从 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 | 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 | 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 列中提取嵌套字典?