如何从路径列中获取基本文件名

ADS*_*KUL 4 python filenames path pandas

我有一个带有文件路径列的数据框。

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

我的数据框看起来像:

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']
})
Run Code Online (Sandbox Code Playgroud)
先生号 电子邮件 文件名
18 测试@test.com C:/Users\Test.csv
19 测试@test.com C:/Users\Test1.csv
20 测试@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']
})
Run Code Online (Sandbox Code Playgroud)
先生号 电子邮件 文件名
18 测试@test.com 测试
19 测试@test.com 测试1
20 测试@test.com 测试1

我想使用 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])
Run Code Online (Sandbox Code Playgroud)

但它只对一条路径有用,如何将其应用于整列?

Pav*_*ran 8

用于pandas.Series.apply迭代列,并将结果分配给新列。

\n
df["filename"] = df["filename"].apply(os.path.basename)\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
df["filename"] = df["filename"].apply(lambda path: os.path.basename(path))\n
Run Code Online (Sandbox Code Playgroud)\n

例子:

\n
>>> df\n   Sr No          Email            filename\n0     18  Test@test.com   C:/Users\\Test.csv\n1     19  Test@test.com  C:/Users\\Test1.csv\n2     20  Test@test.com  C:/Users\\Test1.csv\n\n>>> df["filename"] = df["filename"].apply(os.path.basename)\n>>> df\n   Sr No          Email   filename\n0     18  Test@test.com   Test.csv\n1     19  Test@test.com  Test1.csv\n2     20  Test@test.com  Test1.csv\n
Run Code Online (Sandbox Code Playgroud)\n
\n

还有一个使用Path(\'C:/Users\\Test.csv\').name模块的选项pathlib,但这比os.path.basenamepathlib转换stringpathlib对象要慢。

\n

如果文件名之前的斜杠一致,最快的选项是pandas.Series.str.split(例如df[\'filename\'].str.split(\'\\\\\', expand=True).iloc[:, -1])。

\n

测试于python 3.11.2pandas 2.0.0

\n

%timeit测试

\n
df["filename"] = df["filename"].apply(os.path.basename)\n
Run Code Online (Sandbox Code Playgroud)\n

结果

\n
df["filename"] = df["filename"].apply(lambda path: os.path.basename(path))\n
Run Code Online (Sandbox Code Playgroud)\n