Изучаем работу с DataFrame в Python на примерах

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

Основные приёмы работы с DataFrame

Как создать DataFrame из словаря или списка?

Базовый способ: передать словарь, где ключи - названия столбцов, а значения - списки одинаковой длины.

import pandas as pd

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

Column values python (значения столбца в python (pandas))

      Name  Age    City
0    Alice   25  Moscow
1      Bob   30  London
2  Charlie   35   Paris

Python наборы данных (наборы данных в python)

Как создать DataFrame из списка списков?

data2 = [['Alice', 25, 'Moscow'],
         ['Bob', 30, 'London']]
df2 = pd.DataFrame(data2, columns=['Name', 'Age', 'City'])

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

Как создать DataFrame из NumPy массива?

import numpy as np

arr = np.array([[1, 2], [3, 4], [5, 6]])
df3 = pd.DataFrame(arr, columns=['A', 'B'])

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

Типичная ошибка: несоответствие длин списков в словаре или неверное указание количества столбцов. Если списки разной длины, Pandas выдаст ValueError: arrays must all be same length. Чтобы избежать, следует проверять данные перед созданием.

Как загрузить DataFrame из CSV файла?

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

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

Если разделитель не запятая, укажите параметр sep или delimiter.

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

Python pandas index (работа с индексом dataframe в pandas)

Как загрузить только определённые столбцы?

df_part = pd.read_csv('data.csv', usecols=['Name', 'Age'])

Python dataframe строки (строки в dataframe pandas)

Как задать пользовательские имена столбцов при чтении?

df_custom = pd.read_csv('data.csv', names=['ID', 'Name', 'Age'], header=0)

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

Проблема: пропуск строки с заголовками может сдвинуть данные. При использовании names и header=0 первая строка становится заголовком, и дублирование не происходит. Если заголовок отсутствует, используйте header=None.

Как отфильтровать строки DataFrame по условию?

Наиболее эффективный способ - использовать булеву маску.

mask = df['Age'] > 30
filtered = df[mask]

Pandas python таблица (таблица pandas в python)

      Name  Age    City
2  Charlie   35   Paris

столбец dataframe python (работа со столбцом dataframe в pandas)

Как отфильтровать строки методом query?

filtered2 = df.query('Age > 30 and City == "Paris"')

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

Как отфильтровать по нескольким условиям с loc?

filtered3 = df.loc[(df['Age'] > 25) & (df['City'] == 'London')]

Data find python (поиск данных в python)

Ошибка: использование or вместо | в условиях. Булевы операторы and/or работают не поэлементно, а с целыми объектами; для масок используйте & и |, оборачивая каждое условие в скобки.

Как сгруппировать данные и вычислить статистику?

grouped = df.groupby('City')['Age'].mean()

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

Результат - Series с индексом по городам.

City
London    30.0
Moscow    25.0
Paris     35.0
Name: Age, dtype: float64

работа с библиотекой pandas python (работа с библиотекой pandas в python)

Как получить несколько агрегаций сразу через agg?

stats = df.groupby('City').agg({'Age': ['mean', 'std', 'count']})

Python pandas работа с данными (работа с данными в pandas)

Как применить собственную функцию к группе?

def range_func(x):
    return x.max() - x.min()

custom = df.groupby('City')['Age'].apply(range_func)

Python get url (получение url в python)

Проблема: группировка по столбцу с пропущенными значениями. Строки с NaN в ключе группировки обычно игнорируются. Чтобы их сохранить, используйте dropna=False в groupby.

Как объединить два DataFrame по ключу?

df1 = pd.DataFrame({'ID': [1,2,3], 'Name': ['Alice','Bob','Charlie']})
df2 = pd.DataFrame({'ID': [1,2,4], 'Score': [85,90,78]})
merged = pd.merge(df1, df2, on='ID', how='inner')

Get data python (получение данных в python)

   ID   Name  Score
0   1  Alice     85
1   2    Bob     90

Python get file name (получение имени файла в python)

Как объединить с сохранением всех строк левого DataFrame?

merged_left = pd.merge(df1, df2, on='ID', how='left')

Python get параметры (получение параметров в python)

Как объединить по разным именам столбцов?

pd.merge(df1, df2, left_on='ID', right_on='UserID')

Python get path (получение пути в python)

Типичная ошибка: дублирование ключей. Если в обоих таблицах есть повторяющиеся значения ключа, произойдёт декартово произведение, что может сильно увеличить размер результата. Рекомендуется проверять уникальность ключей до слияния.

Как обработать пропущенные значения?

Удаление строк с любыми NaN:

df_clean = df.dropna()

Get string python (получение строки в python)

Замена пропусков на среднее по столбцу:

df['Age'].fillna(df['Age'].mean(), inplace=True)

выводить только числа python (фильтрация чисел в python)

Как интерполировать пропуски?

df['Value'].interpolate(method='linear')

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

Как заполнить пропуски предыдущим значением (forward fill)?

df['Value'].ffill()

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

Ошибка: метод fillna с параметром inplace=True не возвращает новый объект, изменяет исходный. Следует проявлять осторожность, чтобы не потерять данные. Лучше использовать присваивание: df = df.fillna(...).

Как применить функцию к каждому элементу столбца?

df['Name_upper'] = df['Name'].str.upper()

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

Для числовых преобразований - apply или векторизованные операции.

Как применить функцию ко всем строкам DataFrame?

def combine(row):
    return f"{row['Name']} from {row['City']}"
df['Description'] = df.apply(combine, axis=1)

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

Как применить функцию к каждому элементу с использованием applymap?

df_numeric = df.select_dtypes(include=[np.number])
df_squared = df_numeric.applymap(lambda x: x ** 2)

Проблема: applymap работает с каждым значением, но может быть медленным на больших датафреймах. Для числовых данных предпочтительнее векторизованные операции (например, df['Age'] * 2).

- Python как проверить строку (проверка строки в python)
- Json файл python (работа с json файлами в python)

Расширенные примеры работы с DataFrame

Как выполнить перекрёстную таблицу (crosstab) с несколькими агрегациями?

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

# Данные о продажах
df_sales = pd.DataFrame({
    'Region': ['North', 'South', 'North', 'East', 'South', 'East'],
    'Product': ['A', 'A', 'B', 'A', 'B', 'B'],
    'Revenue': [100, 150, 80, 200, 120, 90],
    'Quantity': [10, 15, 8, 20, 12, 9]
})

# Перекрёстная таблица со средним доходом и суммой количества
ct = pd.crosstab(index=df_sales['Region'], columns=df_sales['Product'],
                 values=df_sales['Revenue'], aggfunc='mean')
print(ct)
Product     A      B
Region              
East     200.0   90.0
North    100.0   80.0
South    150.0  120.0

Как преобразовать DataFrame в формат длинный (melt) и обратно (pivot)?

Пример
# Исходные данные в широком формате
df_wide = pd.DataFrame({
    'ID': [1, 2],
    'Product_A': [100, 200],
    'Product_B': [150, 250]
})
print('Широкий формат:')
print(df_wide)

# Преобразование в длинный формат
df_long = pd.melt(df_wide, id_vars=['ID'], var_name='Product', value_name='Sales')
print('\nДлинный формат:')
print(df_long)

# Обратное преобразование через pivot (иногда нужен pivot_table)
df_back = df_long.pivot_table(index='ID', columns='Product', values='Sales', aggfunc='sum')
print('\nВосстановленный широкий формат:')
print(df_back)
Широкий формат:
   ID  Product_A  Product_B
0   1        100        150
1   2        200        250

Длинный формат:
   ID    Product  Sales
0   1  Product_A    100
1   2  Product_A    200
2   1  Product_B    150
3   2  Product_B    250

Восстановленный широкий формат:
Product  Product_A  Product_B
ID                          
1               100        150
2               200        250

Как применить rolling-функцию с несколькими столбцами?

Пример
# Данные временного ряда
df_ts = pd.DataFrame({
    'Date': pd.date_range('2023-01-01', periods=5, freq='D'),
    'Value': [10, 20, 15, 30, 25]
})
df_ts.set_index('Date', inplace=True)

# Скользящее среднее за 2 дня
df_ts['RollingMean'] = df_ts['Value'].rolling(window=2).mean()
print(df_ts)
            Value  RollingMean
Date                          
2023-01-01     10          NaN
2023-01-02     20         15.0
2023-01-03     15         17.5
2023-01-04     30         22.5
2023-01-05     25         27.5

Как создать сводную таблицу с несколькими уровнями индексов и столбцов?

Пример
# Данные с категориями
df_pivot = pd.DataFrame({
    'Year': [2020, 2020, 2021, 2021, 2020, 2021],
    'Quarter': ['Q1', 'Q2', 'Q1', 'Q2', 'Q1', 'Q2'],
    'Product': ['A', 'A', 'A', 'A', 'B', 'B'],
    'Sales': [100, 150, 120, 130, 80, 110]
})

pivot = df_pivot.pivot_table(index=['Year', 'Quarter'], 
                             columns='Product', 
                             values='Sales', 
                             aggfunc='sum', 
                             fill_value=0)
print(pivot)
Product         A   B
Year Quarter        
2020 Q1       100  80
     Q2       150   0
2021 Q1       120   0
     Q2       130 110

Как выполнить условное форматирование ячеек с помощью style?

Пример
# Создаём DataFrame со случайными числами
np.random.seed(42)
df_style = pd.DataFrame(np.random.randn(4, 3), columns=['A', 'B', 'C'])

# Функция для выделения отрицательных значений красным
def highlight_negative(val):
    color = 'red' if val < 0 else 'green'
    return f'color: {color}'

styled = df_style.style.applymap(highlight_negative)
# Для просмотра в Jupyter можно просто вывести styled
# Для сохранения в HTML:
html = styled.to_html()

Результат: таблица с зелёными положительными числами и красными отрицательными.

Работа с DataFrame в Python - comments

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