Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加新列year并提取给定文件名(pandas、glob、os)_Python_Pandas_Operating System_Glob - Fatal编程技术网

Python 添加新列year并提取给定文件名(pandas、glob、os)

Python 添加新列year并提取给定文件名(pandas、glob、os),python,pandas,operating-system,glob,Python,Pandas,Operating System,Glob,我想读取多个文件,但当我添加一个新的列year时,给出了错误消息:list对象没有属性“Split”。我想和今天一样。参考: 文件名: Shirt_2016, 2017年11月11日, 2018年鞋展, 2019年鞋展 所有文件名均采用此格式进行标准化,即项目\年 import os import glob import pandas import numpy path='/Item/' files = glob.glob(os.path.join(path,'*.xlsx')) data =

我想读取多个文件,但当我添加一个新的列year时,给出了错误消息:list对象没有属性“Split”。我想和今天一样。参考:

文件名: Shirt_2016, 2017年11月11日, 2018年鞋展, 2019年鞋展

所有文件名均采用此格式进行标准化,即项目\年

import os
import glob
import pandas
import numpy

path='/Item/'
files = glob.glob(os.path.join(path,'*.xlsx'))
data = []
for filename in files:
   df = pd.read_excel(filename,header=None)
   data.append(df)
df=pd.concat(data)

df['Year']= os.path.basename(files.split('.')[0],split['_'][1]))

正如
AttributeError
所示,您调用
split()
的变量
files
是一个列表,而不是字符串

相反,在实例化每个数据帧时,请尝试在其上设置年份:

文件中文件名的
:
df=pd.read\u excel(文件名,标题=None)
#从文件名中提取年份并保存
#在连接数据之前在数据帧上。
年份=文件名。拆分('.')[0],拆分['.'][1]
df[‘年’]=年
data.append(df)

Carolyn的解决方案会起作用,但这里有一个使用pandas函数str.extract的替代方法:
df['year']=df['file'].str.extract('''ud{4}',expand=True)

下面是代码的其余部分,以说明其工作原理:

files = [f"/Item/{f}.xlsx" for f in "Shirt_2016, Shirt_2017, Shoe_2018, Shoe_2019".split(', ')]
df = pd.DataFrame(files,columns=['file']) 

df['year']=df['file'].str.extract('_(\d{4})',expand=True)
df

顺便说一句,当读取多个文件时,创建一个列表然后单击会更快

df=pd.concat([pd.read\u excel(f).assign(file=f)表示文件中的f])

分配是浪费,但读起来是干净的。更快的方法是将此读取封装到函数中,然后调用并行读取:
joblib.parallel(n_jobs=-1)(文件中f的joblib.delayed(read)(f)

其中
def read(f):df=pd.read\u excel(f);df['file']=f;返回df