7

Импорт нескольких CSV-файлов в pandas и объединение в один DataFrame

3

Я бы хотел прочитать несколько 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 ответ(ов)

1

Ваш код выглядит правильно и использует библиотеки 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-файлов

Некоторые моменты для пояснения:

  1. Мы используем ignore_index=True в pd.concat, чтобы сбросить индексы и создать новый последовательный индекс в итоговом DataFrame.
  2. Также я заменил функцию map на генераторное выражение в pd.concat, что делает код более читаемым.

Если у вас возникнут дальнейшие вопросы, не стесняйтесь спрашивать!

0

Легко и быстро

Объедините два или более CSV файла, не создавая список имен.

import glob
import pandas as pd

df = pd.concat(map(pd.read_csv, glob.glob('data/*.csv')))

Этот код использует библиотеку glob для поиска всех CSV файлов в папке data/ и объединяет их в один DataFrame с помощью pandas. Это удобно, так как вам не нужно вручную указывать имена файлов.

0

В вашем случае можно использовать 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 для создания частично примененной функции с заданными параметрами.

0

Вы можете использовать библиотеку 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 без значительных потерь в производительности.

0

Если у вас есть несколько 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-файлы, чтобы избежать ошибок.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь