Pandas - это гибкая библиотека, которая является неотъемлемой частью разработки кода специалистом по данным. Причиной популярности этой библиотеки в Python является ее мощная функция векторизации, при которой за один раз может выполняться весь массив. Это приводит к меньшему времени выполнения по сравнению с эквивалентной операцией с циклом. Кроме того, большинство команд в pandas довольно просты, и у pandas действительно хорошая документация с четкими примерами.

Несмотря на то, что у pandas есть много замечательных функций, которые позволяют обрабатывать миллионы строк данных, есть скрытые мины, о которых нам нужно знать, прежде чем вмешиваться и писать код.

Когда я впервые начал работать с этой библиотекой, я мало знал об этих препятствиях, которые легко проскользнуть, но могут привести к ошибке или неверным результатам. Поэтому я собрал эту статью, чтобы рассказать о некоторых возможных минах, на которые нам нужно обратить внимание, чтобы мы могли их очистить :)

Важность индексации

Имея дело с миллионами точек данных и особенно при выполнении операций с частью набора данных путем фильтрации, важно позаботиться о порядке индекса. Pandas используют индекс в качестве поиска и сопоставляют индекс для выполнения любой операции.

Но некоторые операции могут изменить индекс, и это полезно знать.

💣 Mine 1 - merge (): при объединении двух фреймов данных слияние pandas имеет качество сброса индекса. Это скрытое качество явно не показано в документации. Следовательно, всегда полезно быть осторожным с индексом результирующего фрейма данных, и если в случае, если мы хотим выполнить какие-либо операции (арифметические, агрегированные и т. Д.), Нам придется сохранить индекс старого фрейма данных и применить его к новому. Таким образом, мы можем устранить ошибку несоответствия индекса, которую будет довольно неприятно обнаружить, если мы имеем дело с 1000 строк кода и 100 миллионами данных.

💣 Mine 2 - Остерегайтесь предупреждений на основе индекса: библиотека Pandas по своей сути выдает предупреждение ⚠️, когда собирается изменить индекс фрейма данных при выполнении отфильтрованного поиска (операций, которые включить фильтрацию на основе .loc, .iloc). Всегда полезно полностью осознавать и понимать их, прежде чем переносить наш код в рабочую среду.

В качестве одного из таких примеров я недавно выполнял индексирование на основе логических значений и наткнулся на предупреждение UserWarning: логический ключ индекса переиндексирован для соответствия индексу фрейма данных. Вот пример индексации на основе логических значений

import pandas as pd
df = pd.DataFrame(data={'values':[1,56,3,4,5,98,100]})
condition = (df.values > 10) 
df.loc[condition, 'marker'] = 'Yes'

Если индекс condition и df не совпадают, pandas попытается обработать это и даст нам предупреждение, чтобы убедиться, что наша логика кода верна.

Знать, когда использовать Inplace

💣 Mine 3 - Многие операции в пандах имеют этот внутренний параметр, называемый inplace, который может иметь значение True или False в зависимости от того, хотим ли мы изменения непосредственно в исходном фрейме данных или назначить изменения новому фрейму данных соответственно.

При установке inplace = True должны произойти следующие серии событий:

  • Панды создают копию исходных данных
  • Выполняет описанные вычисления, такие как удаление столбца, строки, dropna и т. Д.
  • Присваивает результат исходным данным
  • Удаляет копию

Несмотря на то, что на высоком уровне inplace = True кажется, что он не создает копию фрейма данных в памяти, он все же создает его для выполнения необходимых вычислений, как описано в потоке событий выше.

Кроме того, код становится труднее отлаживать, если панды выдают предупреждение ⚠️ SettingwithCopy, которое часто обязательно происходит, когда inplace включен.

Но в некоторых операциях inplace = True может сэкономить время вычислений. Следовательно, часто бывает полезно понять объем и объем набора данных, который мы используем, прежде чем использовать параметр inplace.

Дата и время неудач

Когда я впервые начал работать с пандами, мне было немного сложно работать с полем DateTime. Это связано с тем, что при работе с полем DateTime важно учитывать часовой пояс, и при выполнении любых арифметических операций с этим полем, таких как добавление часов / дней / месяцев, его необходимо сначала преобразовать в формат DateTime от целого числа, и в противном случае может возникнуть ошибка, на которую трудно было обратить внимание вначале 🤖

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

💣 Mine 4 - Фактическая постановка проблемы состоит в том, чтобы отфильтровать на основе условия и заполнить значения дат только в этих отфильтрованных строках. После завершения этой задачи я обнаружил, что некоторые значения даты в конкретном столбце datetime были числами. Целочисленные значения заполнялись спорадически, в том смысле, что некоторые строки имели правильные значения даты, а некоторые - числа. Когда я попытался найти эту проблему в Интернете, мне предложили преобразовать dtype результирующего столбца в DateTime. Но это не решило мою проблему.

Позже я понял, что проблема была в инициализации столбца. Поскольку я инициализировал столбец как

df['date_field'] = np.NaN

Вместо этого он должен быть инициализирован как

df['date_field'] = pd.NaT

Отсутствующие скобки

💣 Mine 5 - для некоторых команд pandas присуще указывать () , даже если функции не передаются аргументы. Если мы забудем указать скобки для этих функций, pandas не выдаст ошибок, а выведет немного странные результаты, которые могут сбивать с толку.

[IN] df.values.sample
1,56,3,4,5,98,100
[OUT] <bound method NDFrame.sample of 0                          
1
1                           56
2                           3
3                           4
4                           5
5                           98
6                           100

Вывод

Имея дело с огромным количеством данных с большим количеством несоответствий, всегда полезно полностью понять базовую логику кода, и если в случае, pandas выдает некоторые предупреждающие ошибки, полезно проверить, почему и как их удалить, прежде чем игнорировать.

Следовательно, на высоком уровне мы могли справляться с любыми неудачами, постепенно знакомясь с фреймворком 🤓