Додавання кадрів даних панд, створених у циклі for


82

Я отримую доступ до серії файлів Excel у циклі for. Потім я читаю дані у файлі Excel у фрейм даних pandas. Я не можу зрозуміти, як додати ці кадри даних разом, щоб потім зберегти фрейм даних (який тепер містить дані з усіх файлів) як новий файл Excel.

Ось що я спробував:

for infile in glob.glob("*.xlsx"):
    data = pandas.read_excel(infile)
    appended_data = pandas.DataFrame.append(data) # requires at least two arguments
appended_data.to_excel("appended.xlsx")

Дякую!

Відповіді:


165

Використовуйте pd.concatдля об’єднання списку DataFrame в один великий DataFrame.

appended_data = []
for infile in glob.glob("*.xlsx"):
    data = pandas.read_excel(infile)
    # store DataFrame in list
    appended_data.append(data)
# see pd.concat documentation for more info
appended_data = pd.concat(appended_data)
# write DataFrame to an excel sheet 
appended_data.to_excel('appended.xlsx')

1
Фантастично, дякую. Чи знаєте ви, чи існує простий спосіб додати ідентифікатор до кожного DataFrame до остаточного файлу Excel? Метою було б можливість відстежувати, з якого файлу надходили дані.
El Confuso

4
Додайте новий стовпець з назвою файлу під час читання даних. Може бути щось таке просте, як data['filename'] = infile.
біоптах

1
Чудово! Спасибі купу. Якщо хтось у майбутньому захоче спробувати це, просто замініть його ]на індекс, що не є індексом :)
El Confuso

6
@FaCoffee, видаліть axis=1із коду, щоб прив’язати dfs один під одним. :)
anky

2
Якщо не вказано інше, я думаю, що "додати" означає рядки, а не стовпці, і радив би вилучити axis=1з цієї відповіді.
Макс Геніс,

42

Ви можете спробувати це.

data_you_need=pd.DataFrame()
for infile in glob.glob("*.xlsx"):
    data = pandas.read_excel(infile)
    data_you_need=data_you_need.append(data,ignore_index=True)

Сподіваюся, це може допомогти.



Дякую, чувак, це дуже корисно
ye jiawei

1
Привіт @ Ілля - якщо припустити, що ти посилаєшся на пост Олександра у посиланні - повільніша продуктивність є посиланням на використання DataFrame.appendоперації замість list.appendоперації - не через DataFrame.appendоперацію замість DataFrame.concatоперації.
Чарлі

Я не впевнений, як python управляє пам'яттю, але я мав би очікувати, що операція додавання використовуватиме менше або рівний обсяг пам'яті (оскільки нерелевантна інформація - це зібране сміття), і операція concat, ймовірно, використовує додавання 'під капотом' - провідний до незначного, можливо жодного покращення продуктивності (і, можливо, гіршої продуктивності, враховуючи більші вимоги до пам'яті).
Чарлі

2
я спробував це, але мій data_you_need порожній. не знаю, що пішло не так
качка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.