Программирование

Как извлечь скаляр из ячейки DataFrame в pandas

Узнайте, как получить одно скалярное значение из ячейки DataFrame в pandas, используя at, iat, squeeze или item, чтобы ваш код был чистым и типобезопасным.

Как извлечь единственное скалярное значение из ячейки DataFrame в pandas?

У меня есть фильтр, который возвращает ровно одну строку:

python
filtered = df[(df['l_ext'] == l_ext) &
              (df['item'] == item) &
              (df['wn'] == wn) &
              (df['wd'] == 1)]

Когда я пытаюсь получить значение из столбца:

python
val = filtered['col_name']

получаю DataFrame с одной строкой и одним столбцом, а не одно число. Как извлечь скалярное значение (например, float) из этой ячейки в pandas?

Скаляр, который вам нужен, можно получить в несколько простых однострочных операций, например.
Поскольку ваш фильтр гарантирует единственную строку, самый быстрый и понятный способ – использовать доступ at или iat, либо «сжать» Series в скаляр с помощью .item().


Содержание


Быстрый доступ к скалярному значению с at и iat

Если вы уже знаете точный индекс и название столбца, самый прямой путь – использовать df.at (по метке) или df.iat (по позиции).
Поскольку фильтр возвращает одну строку, можно безопасно обратиться к ней напрямую:

python
# Используем доступ по метке
val = filtered.at[filtered.index[0], 'col_name']

# Используем доступ по позиции (самый быстрый для скалярных запросов)
val = filtered.iat[0, filtered.columns.get_loc('col_name')]

Оба вызова возвращают обычный Python‑скаляр (float, int и т.д.), а не DataFrame или Series.
Официальная документация pandas описывает at и iat как самый быстрый способ получения скалярных значений【pandas docs at】.


Сжатие однострочной Series в скаляр

Если вам удобнее оставить логику фильтрации как есть, можно сначала извлечь Series, а затем «сжать» её, например:

python
# Получаем Series с одним столбцом
col_series = filtered['col_name']          # всё ещё Series

# Превращаем Series в скаляр
val = col_series.squeeze()                # -> скаляр
# или
val = col_series.item()                   # тот же результат

.squeeze() сворачивает одностолбцовую Series в скаляр, а .item() явно возвращает базовый Python‑скаляр.
Обе функции поддерживаются в pandas 1.x и 2.x и задокументированы здесь【pandas docs squeeze】 и【pandas docs item】, к примеру.


Другие удобные альтернативы

Метод Когда использовать Пример
filtered.values[0][0] Быстрый однострочник, но менее явно val = filtered.values[0][0]
filtered.to_numpy()[0, 0] Работает в старых версиях pandas, более «NumPy‑подобно» val = filtered.to_numpy()[0, 0]
filtered.iloc[0].col_name Если вам нравится цепочка .iloc val = filtered.iloc[0].col_name

Все эти варианты дают скаляр, хотя они чуть менее эффективны или понятны, чем at/iat или squeeze/item.


Что стоит избегать (устаревший get_value)

DataFrame.get_value был быстрым помощником для скалярных запросов, но удалён в pandas 2.0【pandas docs get_value】.
Использование его вызовет AttributeError, так что лучше придерживаться at, iat или описанных выше методов сжатия.


Вывод

  • Для гарантированного однострочного фильтра filtered.at[filtered.index[0], 'col_name'] или filtered.iat[0, col_index] – самый лаконичный, быстрый и понятный способ получить скаляр.
  • Если у вас уже есть Series, можно воспользоваться .squeeze() или .item() для её сворачивания в скаляр.
  • Избегайте устаревшего get_value; используйте современные доступы.

Эти подходы дают чистый, типобезопасный скаляр (например, float) из нужной ячейки, так что ваш код остаётся аккуратным и эффективным.

Авторы
Проверено модерацией
Модерация