Импортируйте несколько файлов Excel и объединяйте их в одну pandas df с именем источника в виде столбца - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь объединить несколько файлов xlsx в один кадр данных pandas в python. Кроме того, я хочу включить столбец, в котором перечислены исходные файлы для каждой строки. Мой код выглядит следующим образом:

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
import glob
import os

# get the path for where the xlsx files are
path = os.getcwd()
files = os.listdir(path)
files_xlsx = [f for f in files if f[-4:] == 'xlsx']

# create new dataframe
df = pd.DataFrame()

# read data from files and add into dataframe
for f in files_xlsx:
    data = pd.read_excel(f, 'Sheet 1')
    df['Source_file'] = f
    df = df.append(data)

, однако, когда я смотрю на столбец «Source_file», в нем указывается окончательный файл, который он читает, в качестве имени для каждой строки. Я потратил гораздо больше времени, чем пытался это исправить. Что я делаю не так?

1 Ответ

0 голосов
/ 09 ноября 2019

в вашем цикле for вы пишете для каждой итерации df, поэтому вы получите только окончательный файл,

, что вам нужно сделать, это delcare список перед рукой, и добавьте это,

, так как вы вызвали glob, давайте использовать это также.

files = glob.glob(os.path.join(os.getcwd()) + '\*.xlsx')
dfs = [pd.read_excel(f,sheet_name='Sheet1') for f in files]
df = pd.concat(dfs)

, если вы хотите добавить имя файла в df,

files = glob.glob(os.path.join(os.getcwd()) + '\*.xlsx')
dfs = [pd.read_excel(f,sheet_name='Sheet1') for f in files]
file_names = [os.path.basename(f) for f in files]
df = pd.concat(dfs,keys=file_names)

Использование модуля Pathlib(рекомендуется Python 3.4 +)

from pathlib import Path
files = [f for f in Path.cwd().glob('*.xlsx')]
dfs = [pd.read_excel(f,sheet_name='Sheet1')]
file_names = [f.stem for f in files] 
df = pd.concat(dfs,keys=file_names)

или как один вкладыш:

df = pd.concat([pd.read_excel(f) for f in Path.cwd().glob('*.xlsx')],keys=[f.stem for f in Path.cwd().glob('*.xlsx')],sort=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...