【问题标题】:Get folder path from file with pandas series使用熊猫系列从文件中获取文件夹路径
【发布时间】:2019-04-12 23:08:15
【问题描述】:
我正在使用 pandas 处理文件路径列表,我需要提取文件夹路径。
所以来自:
/volume1/SYN/FOLDER1/FILE.TXT
/volume1/SYN/FOLDER2/SUBFOLDER/FILE.PDF
我需要获取文件夹路径:
/volume1/SYN/FOLDER1/
/volume1/SYN/FOLDER2/SUBFOLDER/
我找到了获取文件名而不是文件夹路径的方法
data['index'] = data['File'].str.split('/').str[-1]
有什么想法吗?
【问题讨论】:
标签:
python
pandas
substring
filenames
series
【解决方案1】:
您可以使用 os.path.splitext 并通过列表解析或带有自定义函数的 apply 提取第一个拆分。
from os.path import splitext
df = pd.DataFrame({'filepaths': [r'/volume1/SYN/FOLDER1/FILE.TXT',
r'/volume1/SYN/FOLDER2/SUBFOLDER/FILE.PDF']})
# list comprehension, more efficient
df['folder'] = [splitext(x)[0] for x in df['filepaths']]
# apply + lambda implicit loop
df['folder'] = df['filepaths'].apply(lambda x: splitext(x)[0])
print(df)
filepaths \
0 /volume1/SYN/FOLDER1/FILE.TXT
1 /volume1/SYN/FOLDER2/SUBFOLDER/FILE.PDF
folder
0 /volume1/SYN/FOLDER1/FILE
1 /volume1/SYN/FOLDER2/SUBFOLDER/FILE
【解决方案2】:
使用rsplit:
data['index'] = data['File'].str.rsplit('/', n=1).str[0] + '/'
如果没有缺失值和性能很重要:
data['index'] = [x.rsplit('/', 1)[0] + '/' for x in data['File']]
print (data)
File index
0 /volume1/SYN/FOLDER1/FILE.TXT /volume1/SYN/FOLDER1/
1 /volume1/SYN/FOLDER2/SUBFOLDER/FILE.PDF /volume1/SYN/FOLDER2/SUBFOLDER/
【解决方案3】:
pandas-path 库将 pathlib 包装为任何 pandas 系列或索引上的 .path 访问器。该功能使这个案例变得非常简单:
import pandas as pd
from pandas_path import path
files = pd.Series([
'/volume1/SYN/FOLDER1/FILE.TXT',
'/volume1/SYN/FOLDER2/SUBFOLDER/FILE.PDF',
])
# .path accessor created by importing pandas_path
files.path.parent
#> 0 /volume1/SYN/FOLDER1
#> 1 /volume1/SYN/FOLDER2/SUBFOLDER
#> dtype: object
reprexlitev0.4.2 于太平洋标准时间 2021-03-06 22:21:15 创建