Структуры данных Pandas — DataFrame

DataFrame — это еще одна ключевая структура данных в Pandas, похожая на двумерную таблицу или таблицу данных в базе данных.

DataFrame — это табличная структура данных, содержащая набор упорядоченных столбцов, каждый из которых может иметь различные типы значений (числовые, строковые, логические).

DataFrame имеет как индексы строк, так и индексы столбцов; его можно рассматривать как словарь, состоящий из Series (имеющих общий индекс).

DataFrame предоставляет различные функции для доступа к данным, фильтрации, разделения, объединения, изменения формы, агрегации и операций преобразования.

DataFrame — очень гибкая и мощная структура данных, широко используемая для таких задач, как анализ данных, очистка, преобразование и визуализация.

Особенности DataFrame:

  • Двумерная структура: DataFrameЭто двумерная таблица, которую можно рассматривать как электронную таблицу Excel или таблицу SQL, со строками и столбцами. Её можно рассматривать как несколькоSeriesобъектов, объединённых в словарь.

  • Типы данных столбцов:Разные столбцы могут содержать данные разных типов, таких как целые числа, числа с плавающей запятой, строки или объекты Python.

  • Index:DataFrameМожет иметь индексы строк и индексы столбцов, подобно номерам строк и меткам столбцов в Excel.

  • Изменяемый размер: Можно добавлять и удалять столбцы, подобно словарю в Python.

  • Автоматическое выравнивание: При выполнении арифметических операций или операций выравнивания данных,DataFrameиндексы будут автоматически выровнены.

  • Обработка пропущенных данных:DataFrameМожет содержать пропущенные данные, Pandas используетNaN(Not a Number) для их представления.

  • Операции с данными: Поддерживает такие операции, как срезы данных, индексация и разбиение на подмножества.

  • Поддержка временных рядов:DataFrameИмеет специальную поддержку данных временных рядов, позволяя легко выполнять срезы, индексацию и манипуляции с данными, основанными на времени.

  • Расширенная функциональность доступа к данным: С помощью.loc、.ilocи.query()метода можно гибко получать доступ к данным и фильтровать их.

  • Гибкая функциональность обработки данных: Включая объединение данных, изменение формы, сводные преобразования, группировку и агрегацию.

  • Визуализация данных: ХотяDataFrameсама по себе она не является инструментом визуализации, её можно комбинировать с библиотеками визуализации, такими как Matplotlib или Seaborn, для выполнения визуализации данных.

  • Эффективный ввод/вывод данных: Позволяет удобно читать и записывать данные, поддерживая множество форматов, таких как CSV, Excel, базы данных SQL и HDF5.

  • Описательная статистика: Предоставляет ряд методов для вычисления описательных статистик, таких как.describe()、.mean()、.sum()и т. д.

  • Гибкое выравнивание и интеграция данных: Можно легко комбинировать с другимиDataFrameилиSeriesобъектами для выполнения операций слияния, соединения или обновления.

  • Функциональность преобразования: Позволяет преобразовывать значения в наборе данных, например, используя.apply()метод для применения пользовательских функций.

  • Скользящее окно и анализ временных рядов: Поддерживает статистику скользящего окна и анализ временных рядов для наборов данных.

Конструктор DataFrame выглядит следующим образом:

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

Описание параметра:

  • data: Часть данных DataFrame, которая может быть словарём, двумерным массивом, Series, DataFrame или другим объектом, который можно преобразовать в DataFrame. Если этот параметр не указан, создаётся пустой DataFrame.
  • index: Индекс строк DataFrame, используемый для идентификации каждой строки данных. Он может быть списком, массивом, объектом индекса и т. д. Если этот параметр не указан, создаётся целочисленный индекс по умолчанию.
  • columns: Индекс столбцов DataFrame, используемый для идентификации каждого столбца данных. Он может быть списком, массивом, объектом индекса и т. д. Если этот параметр не указан, создаётся целочисленный индекс по умолчанию.
  • dtype: Задаёт тип данных DataFrame. Это может быть тип данных NumPy, напримерnp.int64、np.float64и т. д. Если этот параметр не указан, тип данных выводится автоматически на основе данных.
  • copy: Копировать ли данные. По умолчанию False, то есть данные не копируются. Если установить True, входные данные копируются.

Pandas DataFrame — это двумерная структура массива, похожая на двумерный массив.

Пример — создание с использованием списка

import pandas as pd

data = [['Google', 10], ['Example', 12], ['Wiki', 13]]

# Создать DataFrame
df = pd.DataFrame(data, columns=['Site', 'Age'])

# Используйте метод astype, чтобы задать тип данных каждого столбца
df['Site'] = df['Site'].astype(str)
df['Age'] = df['Age'].astype(float)

print(df)

Вы также можете создать его с помощью словаря:

Пример — создание с помощью словаря

import pandas as pd

data = {'Site':['Google', 'Example', 'Wiki'], 'Age':[10, 12, 13]}

df = pd.DataFrame(data)

print (df)

Результат вывода следующий:

В следующем примере используются ndarrays для создания. Длины ndarrays должны быть одинаковыми. Если передается индекс, длина индекса должна быть равна длине массивов. Если индекс не передается, по умолчанию индексом будет range(n), где n — длина массивов.

Для ndarrays можно обратиться к:Объект ndarray в NumPy

Пример - Создание с использованием ndarrays

import numpy as np
import pandas as pd

# Создание двумерного ndarray, содержащего сайт и возраст
ndarray_data = np.array([
    ['Google', 10],
    ['Example', 12],
    ['Wiki', 13]
])

# Использование конструктора DataFrame для создания DataFrame
df = pd.DataFrame(ndarray_data, columns=['Site', 'Age'])

# Вывод DataFrame
print(df)

Результат вывода следующий:

Из приведённого выше вывода видно, что тип данных DataFrame — это таблица, содержащая строки и столбцы:

Вы также можете использовать словарь (ключ/значение), где ключами словаря являются названия столбцов:

Пример — создание с помощью словаря

import pandas as pd

data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]

df = pd.DataFrame(data)

print (df)

Результат вывода:

   a   b     c
0  1   2   NaN
1  5  10  20.0

Часть без соответствующих данных — этоNaN。

Pandas может использовать атрибутlocдля возврата данных указанной строки. Если индекс не задан, индекс первой строки —0, индекс второй строки —1, и так далее:

Пример

import pandas as pd

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

# Загрузка данных в объект DataFrame
df = pd.DataFrame(data)

# Возврат первой строки
print(df.loc[0])
# Возврат второй строки
print(df.loc[1])

Результат вывода следующий:

calories    420
duration     50
Name: 0, dtype: int64
calories    380
duration     40
Name: 1, dtype: int64

Примечание:Возвращаемый результат на самом деле является данными Pandas Series.

Вы также можете вернуть несколько строк данных, используя формат[[ ... ]], где...— индексы каждой строки, разделённые запятыми:

Пример

import pandas as pd

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

# Загрузка данных в объект DataFrame
df = pd.DataFrame(data)

# Возврат первой и второй строк
print(df.loc[[0, 1]])

Результат вывода:

   calories  duration
0       420        50
1       380        40

Примечание:Возвращаемый результат на самом деле является данными Pandas DataFrame.

Мы можем указать значения индекса, как в следующем примере:

Пример

import pandas as pd

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

df = pd.DataFrame(data, index = ["day1", "day2", "day3"])

print(df)

Результат вывода:

      calories  duration
day1       420        50
day2       380        40
day3       390        45

Pandas может использоватьloc-атрибут для возврата строки, соответствующей указанному индексу:

Пример

import pandas as pd

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

df = pd.DataFrame(data, index = ["day1", "day2", "day3"])

# Указать индекс
print(df.loc["day2"])

Результат вывода:

calories    380
duration     40
Name: day2, dtype: int64

Методы DataFrame

Общие операции и методы DataFrame показаны в следующей таблице:

Название методаОписание функций
head(n)Возвращает первые n строк DataFrame (по умолчанию первые 5 строк)
tail(n)Возвращает последние n строк DataFrame (по умолчанию последние 5 строк)
info()Отображает краткую информацию о DataFrame, включая имена столбцов, типы данных, количество непустых значений и т. д.
describe()Возвращает статистическую информацию по числовым столбцам DataFrame, такую как среднее, стандартное отклонение, минимум и т. д.
shapeВозвращает количество строк и столбцов DataFrame (строки, столбцы)
columnsВозвращает все имена столбцов DataFrame
indexВозвращает индекс строк DataFrame
dtypesВернуть тип данных каждого столбца
sort_values(by)Сортировать по указанному столбцу
sort_index()Сортировать по индексу строк
dropna()Удалить строки или столбцы, содержащие пропущенные значения (NaN)
fillna(value)Заполнить пропущенные значения указанным значением
isnull()Проверить наличие пропущенных значений, возвращает булев DataFrame
notnull()Проверить наличие непропущенных значений, возвращает булев DataFrame
loc[]Выбрать данные по метке индекса
iloc[]Выбрать данные по позиционному индексу
at[]Доступ к одному элементу в DataFrame (болееloc[]эффективно)
iat[]Доступ к одному элементу в DataFrame (болееiloc[]эффективно)
apply(func)Применить функцию к DataFrame или Series
applymap(func)Применить функцию к каждому элементу DataFrame (только для DataFrame)
groupby(by)Операция группировки, используется для группировки по столбцу для вычисления сводной статистики
pivot_table()Создать сводную таблицу
merge()Объединить несколько DataFrame (аналогично операции SQL JOIN)
concat()Конкатенировать несколько DataFrame по строкам или столбцам
to_csv()Экспортировать DataFrame в CSV-файл
to_excel()Экспортировать DataFrame в файл Excel
to_json()Экспортировать DataFrame в формат JSON
to_sql()Экспортировать DataFrame в базу данных SQL
query()Выполнить запрос к DataFrame с использованием синтаксиса в стиле SQL
duplicated()Вернуть логический DataFrame, указывающий, является ли каждая строка дубликатом
drop_duplicates()Удалить дублирующиеся строки
set_index()Установить индекс DataFrame
reset_index()Сбросить индекс DataFrame
transpose()Транспонировать DataFrame (поменять местами строки и столбцы)

Пример

import pandas as pd

# Создать DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'City': ['Нью-Йорк', 'Лос-Анджелес', 'Чикаго', 'Хьюстон']
}
df = pd.DataFrame(data)

# Просмотреть первые две строки данных
print(df.head(2))

# Просмотреть основную информацию о DataFrame
print(df.info())

# Получить описательную статистику
print(df.describe())

# Сортировать по возрасту
df_sorted = df.sort_values(by='Age', ascending=False)
print(df_sorted)

# Выбрать указанные столбцы
print(df[['Name', 'Age']])

# Выбрать строки по индексу
print(df.iloc[1:3])  # Выбрать строки со 2 по 3 (по позиции)

# Выбрать строки по метке
print(df.loc[1:2])  # Выбрать строки со 2 по 3 (по метке)

# Вычислить групповую статистику (группировка по городу, расчёт среднего возраста)
print(df.groupby('City')['Age'].mean())

# Обработка пропущенных значений (заполнить пропущенные значения)
df['Age'] = df['Age'].fillna(30)

# Экспорт в файл CSV
df.to_csv('output.csv', index=False)

Вывод:

# 查看前两行数据
     Name  Age         City
0   Alice   25     New York
1     Bob   30  Los Angeles

# 查看 DataFrame 的基本信息
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Name    4 non-null      object 
 1   Age     4 non-null      int64  
 2   City    4 non-null      object 
dtypes: int64(1), object(2)
memory usage: 148.0+ bytes

# 获取描述统计信息
             Age
count   4.000000
mean   32.500000
std     6.454972
min    25.000000
25%    27.500000
50%    32.500000
75%    37.500000
max    40.000000

# 按年龄排序
      Name  Age         City
3    David   40     Houston
2  Charlie   35      Chicago
1      Bob   30  Los Angeles
0    Alice   25     New York

# 按标签选择行
      Name  Age         City
1     Bob   30  Los Angeles
2  Charlie   35      Chicago

# 计算分组统计(按城市分组,计算平均年龄)
City
Chicago        35.0
Houston        40.0
Los Angeles    30.0
New York       25.0
Name: Age, dtype: float64

Дополнительные сведения о DataFrame

Создание DataFrame

Создание из словаря:Ключи словаря становятся именами столбцов, а значения — данными столбцов.

Пример

import pandas as pd

# Создать DataFrame из словаря
df = pd.DataFrame({'Column1': [1, 2, 3], 'Column2': [4, 5, 6]})

Создать из списка списков:Внешний список представляет строки, а внутренние списки — столбцы.

# Создать DataFrame из списка списков

Пример

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
                  columns=['Column1', 'Column2', 'Column3'])

Создать из массива NumPy:Укажите двумерный массив NumPy.

Пример

import numpy as np

# Создать DataFrame из массива NumPy
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))

Создать DataFrame из Series:С помощьюpd.Series()создайте.

Пример

# Создать DataFrame из Series
s1 = pd.Series(['Alice', 'Bob', 'Charlie'])
s2 = pd.Series([25, 30, 35])
s3 = pd.Series(['New York', 'Los Angeles', 'Chicago'])
df = pd.DataFrame({'Name': s1, 'Age': s2, 'City': s3})

Свойства и методы DataFrame

Объекты DataFrame имеют множество атрибутов и методов для манипулирования данными, индексации и обработки, таких как: shape, columns, index, head(), tail(), info(), describe(), mean(), sum() и т.д.

Пример

# Атрибуты и методы DataFrame
print(df.shape)     # Форма
print(df.columns)   # Имена столбцов
print(df.index)     # Индекс
print(df.head())    # Первые несколько строк данных, по умолчанию первые 5 строк
print(df.tail())    # Последние несколько строк данных, по умолчанию последние 5 строк
print(df.info())    # Информация о данных
print(df.describe())# Описательная статистика
print(df.mean())    # Вычислить среднее
print(df.sum())     # Вычислить сумму

Доступ к элементам DataFrame

Доступ к столбцам:Используйте имена столбцов как атрибуты или через.loc[]、.iloc[]доступ, а также можно использовать индексацию по метке или позиции.

Пример

# Доступ по имени столбца
print(df['Column1'])

# Доступ по атрибуту
print(df.Name)    
   
# Доступ через .loc[]
print(df.loc[:, 'Column1'])

# Доступ через .iloc[]
print(df.iloc[:, 0])  # Предположим, что 'Column1' — первый столбец

# Доступ к одному элементу
print(df['Name'][0])

Доступ к строкам:Используйте метки строк и.loc[]для доступа.

Пример

# Доступ по метке строки
print(df.loc[0, 'Column1'])

Изменение DataFrame

Изменение данных столбца:Присваивайте значения столбцам напрямую.

df['Column1'] = [10, 11, 12]

Добавление нового столбца:Присвойте значения новому столбцу.

df['NewColumn'] = [100, 200, 300]

Добавление новой строки:Используйте методы loc, append или concat.

Пример

# Добавление новой строки для конкретного индекса с помощью loc
df.loc[3] = [13, 14, 15, 16]

# Добавление новой строки в конец с помощью append
new_row = {'Column1': 13, 'Column2': 14, 'NewColumn': 16}
df = df.append(new_row, ignore_index=True)

Примечание:append()Этот метод был помечен как устаревший в pandas версии 1.4.0 и будет удалён в будущих версиях. Официально рекомендуется использоватьconcat()как альтернативный метод для объединения данных.

Метод concat() используется для объединения двух или более DataFrame. Если вы хотите добавить строку в другой DataFrame, вы можете рассматривать новую строку как новый DataFrame и затем использовать concat():

Пример

# Добавить новую строку с помощью concat
new_row = pd.DataFrame([[4, 7]], columns=['A', 'B'])  # Создать DataFrame, содержащий только новую строку
df = pd.concat([df, new_row], ignore_index=True)  # Добавить новую строку в исходный DataFrame

print(df)

Удаление элементов DataFrame

Удаление столбцов:Используйте метод drop.

df_dropped = df.drop('Column1', axis=1)

Удаление строк:Также используйте метод drop.

df_dropped = df.drop(0)  # 删除索引为 0 的行

Статистический анализ DataFrame

Описательная статистика:Используйте.describe()для просмотра статистической сводки по числовым столбцам.

df.describe()

Вычисление статистики:Используйте агрегатные функции, такие как.sum()、.mean()、.max()и т. д.

df['Column1'].sum()
df.mean()

Операции индексирования DataFrame

Сбросить индекс:Используйте.reset_index()。

df_reset = df.reset_index(drop=True)

Установить индекс:Используйте.set_index()。

df_set = df.set_index('Column1')

Булево индексирование DataFrame

Используйте булевы выражения: фильтруйте DataFrame на основе условий.

df[df['Column1'] > 2]

Типы данных DataFrame

Просмотр типов данных: используйте атрибутdtypes.

df.dtypes

Преобразование типов данных:Используйте методastype.

df['Column1'] = df['Column1'].astype('float64')

Объединение и разделение DataFrame

Слияние:Используйте методconcatилиmerge.

# 纵向合并
pd.concat([df1, df2], ignore_index=True)

# 横向合并
pd.merge(df1, df2, on='Column1')

Разделение:Используйтеpivot、meltили пользовательские функции.

# 长格式转宽格式
df_pivot = df.pivot(index='Column1', columns='Column2', values='Column3')

# 宽格式转长格式
df_melt = df.melt(id_vars='Column1', value_vars=['Column2', 'Column3'])

Индексация и срезы

DataFrame поддерживает операции индексации и среза по строкам и столбцам.

Пример

# Индексация и срезы
print(df[['Name', 'Age']])  # Извлечь несколько столбцов
print(df[1:3])               # Срез строк
print(df.loc[:, 'Name'])     # Извлечь один столбец
print(df.loc[1:2, ['Name', 'Age']])  # Извлечь указанные строки и столбцы с помощью индексации по меткам
print(df.iloc[:, 1:])        # Извлечь указанные столбцы с помощью позиционной индексации

Примечания

  • DataFrameЭто гибкая структура данных, которая может содержать столбцы разных типов данных.
  • Имена столбцов и индексы строк могут быть строками, целыми числами и т. д.
  • DataFrameВыбор, фильтрация, изменение и анализ данных могут выполняться многими способами.
  • ЧерезDataFrameоперации, вы можете выполнять очистку данных, преобразование, анализ, визуализацию и многое другое.
Другие расширения