Импорт и объединение нескольких 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.



👇 Похожие статьи, которые вам также могут понравиться👇