Способы представления структурированных данных в Python для анализа

Раздел: Data Science -> Pandas

Основные подходы к созданию структурированных данных

Структурированные данные - это табличные наборы, где каждый столбец содержит однотипные значения, а строки - отдельные записи. В экосистеме Python основным инструментом для работы с ними служит библиотека Pandas. Однако существуют и другие способы формирования таких данных, зависящие от источника (словари, файлы, базы данных).

Как создать наиболее гибкое табличное представление с помощью Pandas DataFrame?

Самый эффективный способ - использовать конструктор pd.DataFrame(), передавая ему словарь, где ключи становятся названиями столбцов, а значения - списками или скалярами. Такой подход автоматически выравнивает данные по индексу.

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [25, 30, 35],
    'city': ['Moscow', 'London', 'Paris']
}
df = pd.DataFrame(data)
print(df)

обработка больших данных python (обработка больших данных в python)

       name  age    city
0    Alice   25  Moscow
1      Bob   30  London
2  Charlie   35   Paris

очистка данных python (очистка данных в python)

При создании DataFrame из словаря возможна ситуация, когда списки имеют разную длину. Pandas в таком случае заполнит пропуски значением NaN.

Если один из списков короче, выдается ошибка ValueError: arrays must be of the same length. Решение: выровнять длины, добавив None или используя pd.Series.

Вариант 1: Как сформировать DataFrame из списка словарей?

Каждый элемент списка представляет одну строку.

rows = [
    {'name': 'Alice', 'age': 25, 'city': 'Moscow'},
    {'name': 'Bob', 'age': 30, 'city': 'London'},
    {'name': 'Charlie', 'age': 35, 'city': 'Paris'}
]
df2 = pd.DataFrame(rows)
print(df2)

Python подготовка данных (подготовка данных в python)

       name  age    city
0    Alice   25  Moscow
1      Bob   30  London
2  Charlie   35   Paris

работа с dataframe python (работа с dataframe в python)

Проблема: если в словарях разный набор ключей, отсутствующие поля заполнятся NaN. Это может быть неожиданно, если ожидалась ошибка.

Для контроля за столбцами полезно явно указать параметр columns в конструкторе: pd.DataFrame(rows, columns=['name','age','city']). Тогда ключи, не входящие в список, игнорируются.

Вариант 2: Как загрузить структурированные данные из CSV?

Функция pd.read_csv() - основной инструмент для чтения табличных файлов.

df_csv = pd.read_csv('data.csv')
print(df_csv.head())

Python работа с большими данными (работа с большими данными в python)

Если файл содержит разделитель, отличный от запятой, укажите параметр sep.

df_tsv = pd.read_csv('data.tsv', sep='\t')
print(df_tsv.info())

структурированные данные python (структурированные данные в python)

Частая ошибка - неправильное определение заголовков. Если в первой строке файла нет названий столбцов, следует добавить header=None и задать names.
df_no_header = pd.read_csv('data_no_header.csv', header=None, names=['col1','col2','col3'])

генерация данных python (генерация данных в python)

Вариант 3: Как получить структурированные данные из JSON?

Для файлов JSON удобно использовать pd.read_json().

df_json = pd.read_json('data.json')
print(df_json)

Python код символа (код символа в python)

Если JSON имеет вложенную структуру, может потребоваться json_normalize().

from pandas import json_normalize
import json

with open('nested.json') as f:
    data = json.load(f)
df_nested = json_normalize(data, record_path='items', meta=['user'])
print(df_nested)

код из файла python (код из файла python)

При использовании json_normalize важно правильно указать путь к записям. Неправильный record_path приведет к пустому DataFrame.

Вариант 4: Как создать DataFrame из массивов NumPy?

Массивы NumPy хорошо интегрируются с Pandas.

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
df_np = pd.DataFrame(arr, columns=['A', 'B', 'C'])
print(df_np)

обработка данных на python (обработка данных на python)

   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9

Особенность: если массив одномерный, он будет одной строкой. Транспонирование может понадобиться.

Несоответствие размеров при задании columns вызывает ошибку. Количество столбцов должно совпадать с числом столбцов массива.
- Python как проверить строку (проверка строки в python)
- как работать с данными в python (работа с данными в python)
- Column values python (значения столбца в python (pandas))

Расширенные примеры создания структурированных данных

Создание DataFrame с мультииндексом

Иногда требуется иерархическая индексация строк. Для этого можно передать в pd.DataFrame кортежи в качестве ключей словаря или использовать pd.MultiIndex.

Пример
import pandas as pd
import numpy as np

arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
data = np.random.randn(4, 3)
df_multi = pd.DataFrame(data, index=index, columns=['X', 'Y', 'Z'])
print(df_multi)
                     X         Y         Z
first second
A     1       0.123 -0.456  0.789
      2      -0.234  0.567 -0.890
B     1       0.345 -0.678  0.901
      2      -0.456  0.789 -0.012

Импорт данных из SQL с помощью read_sql

Pandas позволяет напрямую загружать результаты SQL-запросов.

Пример
import sqlite3

conn = sqlite3.connect('example.db')
query = 'SELECT * FROM employees'
df_sql = pd.read_sql(query, conn)
print(df_sql.head())
conn.close()

Совет: для больших наборов данных используйте параметр chunksize для итерационной загрузки.

Преобразование словаря с вложенными структурами

Если словарь содержит списки или другие словари, json_normalize может развернуть их в плоскую таблицу.

Пример
from pandas import json_normalize

data = {
    'user': 'Alice',
    'orders': [
        {'item': 'book', 'price': 10},
        {'item': 'pen', 'price': 2}
    ]
}
df_orders = json_normalize(data, record_path='orders', meta='user')
print(df_orders)
  item  price   user
0  book     10  Alice
1   pen      2  Alice

Создание DataFrame из списка именованных кортежей

Модуль collections.namedtuple создает легковесные структуры, которые можно преобразовать в таблицу.

Пример
from collections import namedtuple

Person = namedtuple('Person', ['name', 'age', 'city'])
people = [Person('Alice', 25, 'Moscow'), Person('Bob', 30, 'London')]
df_nt = pd.DataFrame(people)
print(df_nt)
    name  age    city
0  Alice   25  Moscow
1    Bob   30  London

Обработка ошибок при чтении CSV с некорректными данными

При загрузке больших файлов можно столкнуться с несоответствием типов. Параметр dtype помогает явно задать типы столбцов, а error_bad_lines=False пропускает строки с ошибками (устарело, лучше on_bad_lines='skip').

Пример
df_skip = pd.read_csv('messy.csv', on_bad_lines='skip', dtype={'id': 'Int64', 'value': 'float64'})
print(df_skip.dtypes)

Структурированные данные в Python - comments

En
структурированные данные python (python)