Как создать DataFrame в pandas

Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.

Способы создания

  1. Из словаря (dict) — самое частое
  2. Из списка словарей — по строкам
  3. Из списка кортежей с явными колонками
  4. Из CSV / Excel / JSON — чтение файла
  5. Из SQL — через pandas-коннектор
  6. Из numpy array
  7. Пустой → заполнение

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 int

4. 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+ вопросами для собесов.