Изучаем работу с DataFrame в Python на примерах
Основные приёмы работы с 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).
Расширенные примеры работы с 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()
Результат: таблица с зелёными положительными числами и красными отрицательными.