Как извлечь скаляр из ячейки DataFrame в pandas
Узнайте, как получить одно скалярное значение из ячейки DataFrame в pandas, используя at, iat, squeeze или item, чтобы ваш код был чистым и типобезопасным.
Как извлечь единственное скалярное значение из ячейки DataFrame в pandas?
У меня есть фильтр, который возвращает ровно одну строку:
filtered = df[(df['l_ext'] == l_ext) &
(df['item'] == item) &
(df['wn'] == wn) &
(df['wd'] == 1)]
Когда я пытаюсь получить значение из столбца:
val = filtered['col_name']
получаю DataFrame с одной строкой и одним столбцом, а не одно число. Как извлечь скалярное значение (например, float) из этой ячейки в pandas?
Скаляр, который вам нужен, можно получить в несколько простых однострочных операций, например.
Поскольку ваш фильтр гарантирует единственную строку, самый быстрый и понятный способ – использовать доступ at или iat, либо «сжать» Series в скаляр с помощью .item().
Содержание
- Быстрый доступ к скалярному значению с
atиiat - Сжатие однострочной Series в скаляр
- Другие удобные альтернативы
- Что стоит избегать (устаревший
get_value) - Вывод
Быстрый доступ к скалярному значению с at и iat
Если вы уже знаете точный индекс и название столбца, самый прямой путь – использовать df.at (по метке) или df.iat (по позиции).
Поскольку фильтр возвращает одну строку, можно безопасно обратиться к ней напрямую:
# Используем доступ по метке
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, а затем «сжать» её, например:
# Получаем 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) из нужной ячейки, так что ваш код остаётся аккуратным и эффективным.