Pandas DataFrame в Python: построение и фильтрация строк
Создайте pandas DataFrame в Python с помощью pd.DataFrame(data), передав словарь из списков одинаковой длины для столбцов и значений. Используйте DataFrame, когда записям нужны метки строк и столбцов, выборка столбцов или векторизованная фильтрация. Булева маска фильтрует табличные данные без написания цикла Python. Результат сохраняет исходные метки индексов, если вы явно не сбросите их.
Пример Python Pandas DataFrame Для Фильтрации Строк
Вывод:
Результат появится здесь...
Вывод:
product units
Keyboard 12
Monitor 15
Как Работает Этот Пример
import pandas as pdдаёт пакету его стандартный псевдонимpd.- Конструктор pandas DataFrame превращает каждый ключ словаря в метку столбца. Поскольку оба списка содержат три значения, pandas создаёт три строки и назначает
RangeIndexсо значениями0,1и2. sales["units"] >= 10создаёт булеву Series, выровненную по этому индексу. Передача маски обратно вsales[...]оставляет только строки со значениемTrue.to_string(index=False)скрывает индекс в выводимой таблице; оно не удаляет и не перенумеровывает хранимые метки.
Что На Самом Деле Произошло При Запуске DataFrame
Запустите программу дважды на одной странице, открывая Run Details после каждого завершения. Это превращает панель в эксперимент с зависимостями вместо принятия длительности холодного запуска за бенчмарк DataFrame.
| Наблюдение | Холодный рантайм | Тёплый рантайм на той же странице |
|---|---|---|
| Requests | 0 | 0 |
| Новые доступные пакеты | pandas 1.5.3, numpy 1.26.1, python-dateutil 2.8.2, six 1.16.0, pytz 2023.3 | 0 |
| Что изменилось | pandas и его зависимости стали доступны | рантайм уже имел их |
web.run обнаруживает import pandas и загружает поддерживаемые пакеты до запуска Python пользователя. Run Details сообщает разницу между пакетами, доступными до и после запуска, поэтому пустой список Packages при тёплом запуске означает «ничего нового не загружено», а не «pandas не использовался».
Общая продолжительность первого запуска включает начальную загрузку пакетов и выполнение Python. Сравните её с тёплым запуском, прежде чем обвинять pd.DataFrame(...); время варьируется в зависимости от машины и состояния кэша, поэтому используйте список Packages для идентификации работы по начальной загрузке.
Оба запуска сообщают ноль пользовательских запросов, потому что словарь и фильтрация остаются локальными. Холодный запуск всё равно загружает файлы пакетов как активность рантайма. Поэтому «нет пользовательских запросов» доказывает, что фрагмент не делал внешних запросов, а не что браузер не передал ни одного байта.
Ловушка Отфильтрованного Индекса: loc — это не iloc
Фильтрация сохраняет метки. Здесь ready.index.tolist() равен [0, 2], хотя index=False делает вывод похожим на свежую таблицу из двух строк. Код, который обращается ко второй отображаемой строке по метке 1, завершится ошибкой:
Неправильно:
second_product = ready.loc[1, "product"] # KeyError: 1
Правильно для второй строки по позиции:
second_product = ready.iloc[1]["product"]
Правильно, когда дальнейший код нуждается в последовательных метках:
ready = ready.reset_index(drop=True)
second_product = ready.loc[1, "product"]
Используйте .loc для меток индекса и .iloc для позиций с нулевой базой. Сбрасывайте индекс только тогда, когда новые метки являются частью ожидаемого результата; в противном случае сохранение исходных меток помогает отследить отфильтрованные строки обратно в исходные данные.
Ошибки Длины Конструктора DataFrame
Словарь списков должен описывать прямоугольную таблицу. pandas выбрасывает ValueError: All arrays must be of the same length вместо того, чтобы угадывать, как заполнить короткий столбец.
Неправильно:
pd.DataFrame({"product": ["Keyboard", "Mouse"], "units": [12]})
Правильно:
pd.DataFrame({"product": ["Keyboard", "Mouse"], "units": [12, None]})
Добавляйте явное пропущенное значение только тогда, когда оно честно представляет данные; иначе исправьте исходные записи перед построением таблицы.
Когда DataFrame — Правильный Контейнер
| Выбор | Когда подходит |
|---|---|
| DataFrame | Несколько именованных столбцов нуждаются в булевой индексации, операциях над столбцами или табличном анализе |
| Series | Достаточно одного именованного измерения |
| Список словарей | Небольшая коллекция записей нуждается в итерации, но не в операциях над столбцами |
| NumPy array | Однородные числовые данные нуждаются в матричных операциях без меток строк и столбцов |
DataFrame оправдывает расходы на пакет и память, когда метки и векторизованные операции упрощают реальные преобразования. Используйте список словарей, когда записи небольшие и нужна только обычная итерация Python.