Импорт и объединение нескольких CSV-файлов в один pandas DataFrame
CSV (общие значения с разделителями) — это популярный формат файлов, используемый для хранения и обмена данными. На самом деле этот тип источника обычно используется для относительно небольших объемов данных.
pandas
— это широко используемый пакет Python, который позволяет разработчикам обрабатывать и преобразовывать данные в рамках аналитических задач и задач обработки данных. Однако перед выполнением любой задачи pandas необходимо загрузить все данные в память. Это означает, что пакет можно использовать только для относительно небольших объемов данных — ну, это зависит от возможностей хост-машины, но для средней машины мы сможем загрузить только несколько ГБ данных в память.
Таким образом, загрузка CSV-файлов в память и последующая обработка данных с помощью pandas — очень распространенная задача, учитывая, что такие файлы обычно состоят из данных, размер которых можно загрузить в память.
В этой статье мы покажем, как загрузить несколько файлов CSV в один кадр данных pandas. Кроме того, мы также покажем, как идентифицировать исходный файл в каждой записи, чтобы мы могли определить, какая точка данных принадлежит определенному файлу данных.
Теперь давайте предположим, что у нас есть точки данных, собранные в трех отдельных файлах CSV, а именно data_1.csv
, data_2.csv
и data_3.csv
:
colA,colB,colC 'A',1412,True 'B',1252,False 'C',1536,True 'D',1508,False colA,colB,colC 'E',1115,False 'F',6416,True 'G',6241,True colA,colB,colC 'H',1267,False 'I',1252,False 'J',2753,False 'K',7346,True
Объединение нескольких файлов CSV в один кадр данных pandas
Теперь, когда у нас есть фиктивные данные в трех отдельных файлах CSV, мы можем продолжить и импортировать их в один DataFrame.
Первый вариант, который у нас есть, — прочитать каждый отдельный файл CSV с помощью функции pandas.read_csv()
и объединить все загруженные файлы в один фрейм данных с помощью функции pandas.concatenate()
.
import pandas as pd data_files = ['data_1.csv', 'data_2.csv', 'data_3.csv'] df = pd.concat((pd.read_csv(filename) for filename in data_files))
Теперь вновь созданный DataFrame содержит все точки данных, найденные в трех входных файлах CSV:
>>> df colA colB colC 0 'A' 1412 True 1 'B' 1252 False 2 'C' 1536 True 3 'D' 1508 False 0 'E' 1115 False 1 'F' 6416 True 2 'G' 6241 True 0 'H' 1267 False 1 'I' 1252 False 2 'J' 2753 False 3 'K' 7346 True
Обратите внимание, как сбрасывается индекс нашего DataFrame при загрузке данных из нескольких файлов. Если вместо этого вы хотите создать новый индекс для вновь созданного DataFrame, все, что вам нужно сделать, это игнорировать индекс при объединении файлов:
import pandas as pd data_files = ['data_1.csv', 'data_2.csv', 'data_3.csv'] df = pd.concat( (pd.read_csv(filename) for filename in data_files), ignore_index=True ) >>> df colA colB colC 0 'A' 1412 True 1 'B' 1252 False 2 'C' 1536 True 3 'D' 1508 False 4 'E' 1115 False 5 'F' 6416 True 6 'G' 6241 True 7 'H' 1267 False 8 'I' 1252 False 9 'J' 2753 False 10 'K' 7346 True
Избегайте указания явных имен файлов
Теперь давайте предположим, что у нас есть сотни различных файлов CSV, которые мы хотели бы объединить в один кадр данных. Вместо того, чтобы тратить время и строки кода на то, чтобы явно записать все имена отдельных файлов, мы могли бы вместо этого использовать whitecard.
Мы можем сделать это, воспользовавшись модулем glob
, который является частью стандартной библиотеки и предлагает функциональные возможности для поддержки расширения шаблона пути в стиле unix. Например, чтобы создать список, содержащий все файлы, заканчивающиеся на .csv
, в текущем каталоге, мы могли бы использовать следующий фрагмент кода:
>>> import glob >>> >>> data_files = glob.glob('*.csv') >>> data_files ['data_2.csv', 'data_3.csv', 'data_1.csv']
Ниже представлен полный код, который считывает все файлы csv в текущем каталоге и объединяет их в один кадр данных pandas:
import glob import pandas as pd data_files = glob.glob('*.csv') df = pd.concat( (pd.read_csv(filename) for filename in data_files), ignore_index=True )
Другой подход — и, возможно, более питонический — использует преимущества встроенной функции map
, которая позволяет нам запускать метод или функцию над Итерируемым (например, списком Python) без необходимости явного вызова цикла for
:
import glob import pandas as pd df = pd.concat(map(pd.read_csv, glob.glob('*.csv')))
Идентификация записей из разных файлов
В некоторых других случаях использования знание исходного файла данной записи может быть частью информации, которую нам также необходимо отслеживать.
import glob import pandas as pd df = pd.concat( [ pd.read_csv(filename).assign(source=filename) for filename in glob.glob('*.csv') ], ignore_index=True )
Теперь мы ожидаем, что наш DataFrame будет содержать дополнительный столбец, указывающий соответствующее имя файла, из которого каждая запись была добавлена в DataFrame:
>>> df colA colB colC source 0 'E' 1115 False data_2.csv 1 'F' 6416 True data_2.csv 2 'G' 6241 True data_2.csv 3 'H' 1267 False data_3.csv 4 'I' 1252 False data_3.csv 5 'J' 2753 False data_3.csv 6 'K' 7346 True data_3.csv 7 'A' 1412 True data_1.csv 8 'B' 1252 False data_1.csv 9 'C' 1536 True data_1.csv 10 'D' 1508 False data_1.csv
Последние мысли
В этой статье мы продемонстрировали, как загружать несколько файлов CSV и объединять их в один фрейм данных в pandas. Кроме того, мы продемонстрировали, как вы можете выполнить этот импорт без явного указания имен загружаемых файлов. Наконец, мы обсудили, как вы можете даже создать новый столбец в загруженном фрейме данных, чтобы вы могли затем определить исходный файл для каждой записи.
Теперь, когда вы загрузили свои данные в pandas, вы можете воспользоваться богатым API, предлагаемым пакетом, и позволяет выполнять анализ, преобразования и любые виды обработки, которые вам могут понадобиться. Если вы хотите записать кадр данных pandas обратно в файл CSV, обязательно следуйте приведенному ниже руководству 👇.
👉 Стань участником и читай все истории на Medium. Ваш членский взнос напрямую поддерживает меня и других писателей, которых вы читаете. Вы также получите полный доступ ко всем историям на Medium.
👇 Похожие статьи, которые вам также могут понравиться👇