Как создать DataFrame в pandas
Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.
Способы создания
- Из словаря (dict) — самое частое
- Из списка словарей — по строкам
- Из списка кортежей с явными колонками
- Из CSV / Excel / JSON — чтение файла
- Из SQL — через pandas-коннектор
- Из numpy array
- Пустой → заполнение
1. Из словаря (dict)
Каждый ключ = колонка, значение = список.
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Carol'],
'age': [30, 25, 35],
'city': ['Moscow', 'SPb', 'Kazan']
})2. Из списка словарей
Каждый словарь = строка.
data = [
{'name': 'Alice', 'age': 30},
{'name': 'Bob', 'age': 25},
{'name': 'Carol', 'age': 35}
]
df = pd.DataFrame(data)Удобно при обработке API-ответов, JSON.
3. Из списка кортежей + колонки
data = [
('Alice', 30),
('Bob', 25),
('Carol', 35)
]
df = pd.DataFrame(data, columns=['name', 'age'])4. Из CSV
df = pd.read_csv('data.csv')
# с настройками
df = pd.read_csv(
'data.csv',
sep=';', # разделитель
encoding='utf-8', # кодировка
header=0, # строка с заголовками
parse_dates=['date_col'],
dtype={'id': str} # принудительный тип
)5. Из Excel
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')6. Из JSON
df = pd.read_json('data.json')
# вложенный JSON → normalize
import json
with open('data.json') as f:
data = json.load(f)
df = pd.json_normalize(data, record_path='items', meta=['order_id'])7. Из SQL
from sqlalchemy import create_engine
engine = create_engine('postgresql://user:pass@host:5432/db')
df = pd.read_sql('SELECT * FROM users WHERE age > 25', engine)8. Из numpy array
import numpy as np
arr = np.random.rand(5, 3) # 5 строк, 3 колонки
df = pd.DataFrame(arr, columns=['a', 'b', 'c'])9. Пустой DataFrame
df = pd.DataFrame(columns=['name', 'age', 'city'])
# добавить строку
df.loc[0] = ['Alice', 30, 'Moscow']
df.loc[1] = ['Bob', 25, 'SPb']
# лучше накапливать в список и потом создать разом
rows = []
for item in items:
rows.append({'name': item.name, 'age': item.age})
df = pd.DataFrame(rows)10. Из двумерного списка
data = [
['Alice', 30, 'Moscow'],
['Bob', 25, 'SPb']
]
df = pd.DataFrame(data, columns=['name', 'age', 'city'])11. С кастомным индексом
df = pd.DataFrame(
{'name': ['Alice', 'Bob']},
index=[100, 200]
)Или сразу из dict с установкой индекса:
df = pd.DataFrame({'age': [30, 25]}, index=['Alice', 'Bob'])12. Из двух списков через zip
names = ['Alice', 'Bob', 'Carol']
ages = [30, 25, 35]
df = pd.DataFrame(list(zip(names, ages)), columns=['name', 'age'])
# или через dict
df = pd.DataFrame(dict(zip(['name', 'age'], [names, ages])))13. С заданными типами
df = pd.DataFrame({
'id': pd.array([1, 2, 3], dtype='Int64'),
'is_active': pd.array([True, False, True], dtype='boolean'),
'created_at': pd.to_datetime(['2026-01-01', '2026-02-01', '2026-03-01'])
})14. Последовательность чисел / дат
# 100 чисел
df = pd.DataFrame({'x': range(100)})
# даты
df = pd.DataFrame({'date': pd.date_range('2026-01-01', periods=10, freq='D')})15. Копия существующего
df_new = df.copy() # глубокая копия
df_new = df[['name', 'age']].copy() # с выбором колонок16. Из API-ответа (requests + pandas)
import requests
r = requests.get('https://api.example.com/data')
df = pd.DataFrame(r.json())Частые ошибки
1. Одинаковая длина обязательна
# ошибка: разная длина
pd.DataFrame({'a': [1, 2], 'b': [1, 2, 3]})
# ValueError
# правильно — все одной длины2. Добавление в цикле через loc
# медленно на больших объёмах
for i in range(10000):
df.loc[i] = [...]
# быстрее — накапливать в список
rows = []
for ...:
rows.append({'a': 1, 'b': 2})
df = pd.DataFrame(rows)3. Забыть указать dtype
# pd по умолчанию предсказывает тип; может попасть в object
df = pd.DataFrame({'id': [1, 2, 3, None]})
df['id'].dtype # float64 (из-за None)
# явный тип
df['id'] = df['id'].astype('Int64') # nullable int4. Index как колонка
# после reset_index старый индекс попадает как колонка
df_new = df.reset_index()
# если не нужен
df_new = df.reset_index(drop=True)Связанные темы
FAQ
Словарь или список?
Словарь — если данные уже в этой форме. Список словарей — при обработке records из API.
Как быстрее — concat в цикле или накопление в списке?
Накопление в списке + pd.DataFrame в конце. Concat в цикле — O(n²).
Как сохранить типы при чтении?
dtype={'col': 'type'} в pd.read_csv. Для Int с NaN — 'Int64' (с большой I).
Как создать DataFrame из Series?
pd.DataFrame({'col_name': series})
# или
series.to_frame(name='col_name')Тренируйте pandas — откройте тренажёр с 1500+ вопросами для собесов.