我需要在python中把文档路径拆分到文件夹名和文档名,这是一个很大的数据框,包括很多行,对于没有文档名的文件名,只需把文档名一栏留空即可。这是一个大的数据框,包括很多行,对于后面没有文件名的文件名,只需要在结果中把文件名一栏留空即可。例如,我有一个如下的数据框。
no filename
1 \\apple\config.csv
2 \\apple\fox.pdf
3 \\orange\cat.xls
4 \\banana\eggplant.pdf
5 \\lucy
...
我希望输出结果如下图所示。
foldername documentname
\\apple config.csv
\\apple fox.pdf
\\orange cat.xls
\\banana eggplant.pdf
\\lucy
...
我试过下面的代码,但它没有工作。
y={'Foldername':[],'Docname':[]}
def splitnames(x):
if "." in x:
docname=os.path.basename(x)
rm="\\"+docname
newur=x.replace(rm,'')
else:
newur=x
docname=""
result=[newur,docname]
y["Foldername"].append(result[0])
y["Docname"].append(result[1])
return y;
dff=df$filename.apply(splitnames)
非常感谢你的帮助!
不知道你是如何得到路径的,但你可以创建一些Pathlib对象,并使用一些类方法来获取文件名和文件夹名。
:
from pathlib import Path
data = """ no filename
1 \\apple\\config.csv
2 \\apple\\fox.pdf
3 \\orange\\cat.xls
4 \\banana\\eggplant.pdf
5 \\lucy"""
df = pd.read_csv(StringIO(data),sep='\s+')
df['filename'] = df['filename'].apply(Path)
df['folder'] = df['filename'].apply(lambda x : x.parent if '.' in x.suffix else x)
df['document_name'] = df['filename'].apply(lambda x : x.name if '.' in x.suffix else np.nan)
print(df)
no filename folder document_name
0 1 \apple\config.csv \apple config.csv
1 2 \apple\fox.pdf \apple fox.pdf
2 3 \orange\cat.xls \orange cat.xls
3 4 \banana\eggplant.pdf \banana eggplant.pdf
4 5 \lucy \lucy NaN
可能的话,你应该使用两次apply函数来生成单独的列。
import pandas as pd
filenames = [r'\\apple\config.csv', r'\\apple\fox.pdf', r'\\orange\cat.xls', r'\\banana\eggplant.pdf']
df = pd.DataFrame( { 'filename':filenames })
df['Foldername'] = df['filename'].apply( lambda x : r'\\' + x.split('\\')[-2] )
df['Docname'] = df['filename'].apply( lambda x : x.split('\\')[-1] )
默认的apply函数等待单个值被创建,而且在这种情况下,值得说明你想把它用在哪一列。
https:/pandas.pydata.orgpandas-docsstablereferenceapipandas.DataFrame.apply.html。