Способы представления структурированных данных в Python для анализа
Основные подходы к созданию структурированных данных
Структурированные данные - это табличные наборы, где каждый столбец содержит однотипные значения, а строки - отдельные записи. В экосистеме 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 вызывает ошибку. Количество столбцов должно совпадать с числом столбцов массива.Расширенные примеры создания структурированных данных
Создание 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)