Импорт нескольких CSV-файлов в pandas и объединение в один DataFrame
Я бы хотел прочитать несколько CSV файлов из директории и объединить их в один большой DataFrame в pandas. Однако я не могу разобраться, как это сделать. Вот что у меня есть на данный момент:
import glob
import pandas as pd
# Получаем имена файлов с данными
path = r'C:\DRO\DCL_rawdata_files'
filenames = glob.glob(path + "/*.csv")
dfs = []
for filename in filenames:
dfs.append(pd.read_csv(filename))
# Объединяем все данные в один DataFrame
big_frame = pd.concat(dfs, ignore_index=True)
Мне кажется, что мне нужна помощь в цикле for
?
5 ответ(ов)
Ваш код выглядит правильно и использует библиотеки glob
, os
и pandas
для объединения нескольких CSV-файлов, которые соответствуют шаблону "my_files*.csv". Однако я бы предложил несколько улучшений и добавил некоторые комментарии для большей ясности. Вот улучшенная версия кода:
import glob
import os
import pandas as pd
# Создаём путь к файлам, которые мы хотим объединить
path = os.path.join('', "my_files*.csv")
# Используем glob для нахождения всех файлов, соответствующих шаблону
csv_files = glob.glob(path)
# Читаем и объединяем все найденные CSV-файлы в один DataFrame
df = pd.concat((pd.read_csv(f) for f in csv_files), ignore_index=True)
# Теперь df содержит данные из всех CSV-файлов
Некоторые моменты для пояснения:
- Мы используем
ignore_index=True
вpd.concat
, чтобы сбросить индексы и создать новый последовательный индекс в итоговом DataFrame. - Также я заменил функцию
map
на генераторное выражение вpd.concat
, что делает код более читаемым.
Если у вас возникнут дальнейшие вопросы, не стесняйтесь спрашивать!
Легко и быстро
Объедините два или более CSV файла, не создавая список имен.
import glob
import pandas as pd
df = pd.concat(map(pd.read_csv, glob.glob('data/*.csv')))
Этот код использует библиотеку glob
для поиска всех CSV файлов в папке data/
и объединяет их в один DataFrame с помощью pandas
. Это удобно, так как вам не нужно вручную указывать имена файлов.
В вашем случае можно использовать map
в комбинации с functools.partial
, чтобы передать дополнительные аргументы в функцию pd.read_csv
. Вот пример в одну строку:
import pandas as pd
import glob
import functools
df = pd.concat(map(functools.partial(pd.read_csv, sep='|', compression=None),
glob.glob("data/*.csv")))
Обратите внимание, что сам по себе map
не позволяет передавать дополнительные аргументы напрямую, поэтому мы используем functools.partial
для создания частично примененной функции с заданными параметрами.
Вы можете использовать библиотеку pathlib
, которая часто предпочтительнее os.path
, для улучшения вашего кода. Этот метод избегает многократного использования функций concat()
и append()
из pandas.
Из документации pandas:
Стоит отметить, что concat() (а значит и append()) делает полную копию данных, и постоянное использование этой функции может значительно ухудшить производительность. Если вам необходимо выполнить операцию над несколькими наборами данных, используйте списковое выражение.
Вот пример кода:
import pandas as pd
from pathlib import Path
dir = Path("../relevant_directory")
df = (pd.read_csv(f) for f in dir.glob("*.csv"))
df = pd.concat(df)
Таким образом, с помощью pathlib
вы можете удобно собирать все CSV-файлы в данном каталоге и объединять их в один DataFrame без значительных потерь в производительности.
Если у вас есть несколько CSV-файлов, упакованных в ZIP-архив, вы можете использовать модуль zipfile
для их чтения и объединения следующим образом:
import zipfile
import pandas as pd
ziptrain = zipfile.ZipFile('yourpath/yourfile.zip')
train = []
train = [pd.read_csv(ziptrain.open(f)) for f in ziptrain.namelist()]
df = pd.concat(train)
Этот код открывает ZIP-архив, считывает все CSV-файлы и объединяет их в один DataFrame с помощью pandas
. Убедитесь, что в архиве действительно находятся CSV-файлы, чтобы избежать ошибок.
Запись DataFrame pandas в CSV файл
Ошибка UnicodeDecodeError при чтении CSV-файла в Pandas
Как изменить порядок столбцов в DataFrame?
Объединение двух столбцов текста в DataFrame pandas
Установить значение для конкретной ячейки в DataFrame pandas с использованием индекса