Я хотел бы прочитать несколько CSV-файлов из каталога в панды и объединить их в один большой DataFrame. Я не был в состоянии понять это все же. Вот что у меня так далеко:
import glob
import pandas as pd
# get data file names
path =r'C:\DRO\DCL_rawdata_files'
filenames = glob.glob(path + "/*.csv")
dfs = []
for filename in filenames:
dfs.append(pd.read_csv(filename))
# Concatenate all data into one DataFrame
big_frame = pd.concat(dfs, ignore_index=True)
Я думаю, мне нужна помощь в рамках цикла ???
dfs
список, не хотите заменить строкуdata = pd.read_csv(filename)
наdfs.append(pd.read_csv(filename)
. Затем вам нужно будет перебрать список иconcat
, я не думаю,concat
будет работать со спискомdf
s.big_frame = pd.concat(dfs, ignore_index=True)
? Во всяком случае, когда у вас есть список фреймов данных, вам нужно будет перебрать этот список и выполнить егоbig_frame
dfs
Теперь вам нужно повторить цикл , чтобы что-то вродеfor df in dfs: big_frame.concat(df, ignore_index=True)
этого работало, вы также можете попробоватьappend
вместо негоconcat
.concat
должен обрабатывать список DataFrames так же хорошо, как вы. Я думаю, что это очень хороший подход.Ответы:
Если у вас есть одинаковые столбцы во всех ваших
csv
файлах, вы можете попробовать код ниже. Я добавил,header=0
чтобы после прочтенияcsv
первой строке можно было присвоить имена столбцов.источник
df = pd.concat((pd.read_csv(f) for f in all_files))
также, возможно, следует использоватьos.path.join(path, "*.csv")
вместоpath + "/*.csv"
, что делает его независимым от ОС.df['filename'] = os.path.basename(file_)
в цикле for file_. Не уверен, что ответ Сида позволяет это?pandas.read_csv(f).assign(filename = foo)
внутри генератора.assign
вернет весь фрейм данных, включая новый столбецfilename
Альтернатива ответу darindaCoder :
источник
pd.concat((pd.read_csv(f) for f in all_files), ignore_index=True)
. Внутренние скобки требуются для версии Pandas 0.18.1glob.iglob
вместоglob.glob
; Первый возвращает итератор (вместо списка) .источник
df = pd.concat(map(lambda file: pd.read_csv(file, delim_whitespace=True), data_files))
functools.partial
, чтобы избежать лямбдыБиблиотека Dask может читать данные из нескольких файлов:
(Источник: http://dask.pydata.org/en/latest/examples/dataframe-csv.html ).
Фреймы данных Dask реализуют подмножество API-интерфейса данных Pandas. Если все данные помещаются в память, вы можете позвонить
df.compute()
чтобы преобразовать фрейм данных в фрейм данных Pandas.источник
Почти все ответы здесь либо излишне сложны (сопоставление с шаблоном), либо полагаются на дополнительные сторонние библиотеки. Вы можете сделать это в 2 строки, используя все, что уже встроено в Pandas и python (все версии).
Для нескольких файлов - 1 вкладыш:
Для многих файлов:
Эта строка панд, которая устанавливает df, использует 3 вещи:
pd.read_csv()
) iterable (наш список), который является каждым элементом csv в filepaths).источник
df = pd.concat(map(pd.read_csv, glob.glob('data/*.csv))
df = pd.concat(map(pd.read_csv(header=0), glob.glob('data/*.csv))
но выдает ошибку "parser_f () отсутствует 1 обязательный позиционный аргумент: 'filepath_or_buffer'"Изменить: я погуглил свой путь в https://stackoverflow.com/a/21232849/186078 . Однако в последнее время я обнаружил, что быстрее выполнять любые манипуляции с использованием numpy, а затем назначать его один раз для фрейма данных вместо того, чтобы манипулировать самим фреймом данных итеративно, и, похоже, это работает и в этом решении.
Я искренне хочу, чтобы кто-нибудь попал на эту страницу, чтобы рассмотреть этот подход, но не хочу прикреплять этот огромный кусок кода в качестве комментария и делать его менее читабельным.
Вы можете использовать numpy для ускорения конкатенации данных.
Сроки статистика:
источник
Если вы хотите выполнить рекурсивный поиск ( Python 3.5 или выше ), вы можете сделать следующее:
Обратите внимание, что три последние строки могут быть выражены в одной строке :
Вы можете найти документацию
**
здесь . Кроме того, я использовалiglob
вместоglob
, так как он возвращает итератор вместо списка.РЕДАКТИРОВАТЬ: Мультиплатформенная рекурсивная функция:
Вы можете обернуть вышеупомянутое в многоплатформенную функцию (Linux, Windows, Mac), так что вы можете сделать:
Вот функция:
источник
Легко и быстро
Импортируйте два или более
csv
без необходимости составлять список имен.источник
один лайнер
map
, но если вы хотите указать дополнительные аргументы, вы можете сделать:Примечание:
map
само по себе не позволяет вводить дополнительные аргументы.источник
Если несколько CSV-файлов заархивированы, вы можете использовать zipfile, чтобы прочитать все и объединить, как показано ниже:
источник
Еще один on-liner со списком, который позволяет использовать аргументы с read_csv.
источник
На основании хорошего ответа @ Сид.
Перед объединением вы можете загрузить CSV-файлы в промежуточный словарь, который предоставляет доступ к каждому набору данных на основе имени файла (в форме
dict_of_df['filename.csv']
). Такой словарь может помочь вам выявить проблемы с разнородными форматами данных, например, когда имена столбцов не выровнены.Импортируйте модули и найдите пути к файлам:
Примечание:
OrderedDict
не обязательно, но оно сохранит порядок файлов, которые могут быть полезны для анализа.Загрузите CSV-файлы в словарь. Затем объединить:
Ключи - это имена файлов,
f
а значения - содержимое фрейма данных CSV-файлов. Вместо использованияf
в качестве ключа словаря, вы также можете использоватьos.path.basename(f)
или другие методы os.path, чтобы уменьшить размер ключа в словаре до только меньшей части, которая имеет отношение к делу.источник
Альтернатива с использованием
pathlib
библиотеки (часто предпочтительнееos.path
).Этот метод позволяет избежать многократного использования панд
concat()
/apped()
.Из документации Pandas:
Стоит отметить, что concat () (и, следовательно, append ()) создает полную копию данных и что постоянное повторное использование этой функции может привести к значительному снижению производительности. Если вам нужно использовать операцию над несколькими наборами данных, используйте понимание списка.
источник
Вот как вы можете использовать Colab на Google Диске
источник
источник