Добавить новый столбец year и извлечь указанное имя файла (pandas, glob, os) - PullRequest
2 голосов
/ 11 октября 2019

Я хотел бы прочитать несколько файлов, но когда я добавил новый столбец year, выдается сообщение об ошибке: объект списка не имеет атрибута «Split». Я хочу быть таким же. Ссылка: Я хотел бы иметь такой же, как этот

Имя файла: Shirt_2016, Shirt_2017, Shoe_2018, Shoe_2019,

Все имена файлов стандартизированы с этим форматом,item_year.

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]))

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Как подсказывает AttributeError, переменная files, которую вы вызываете split(), является списком, а не строкой.

Вместо этого, попробуйте установить год для каждого кадра данных при создании экземпляра. это:

for filename in files:
    df = pd.read_excel(filename, header=None)
    # Extract the year from the filename & save it
    # on your dataframe before you concatenate the data.
    year = filename.split('.')[0],split['_'][1]
    df['Year'] = year
    data.append(df)
0 голосов
/ 11 октября 2019

Решение Carolyn будет работать, но есть альтернатива, использующая функцию pandas str.extract: df['year']=df['file'].str.extract('_(\d{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

enter image description here

Кстати, при чтении нескольких файлов быстрее создать список, а затем выполнить конкататацию.

df = pd.concat([pd.read_excel(f).assign(file=f) for f in files])

Назначение расточительно, но читается чисто. Еще быстрее обернуть это чтение в функцию, а затем вызвать параллельное чтение: joblib.Parallel(n_jobs=-1)(joblib.delayed(read)(f) for f in files).

, где def read(f): df = pd.read_excel(f); df['file']=f; return df

...