Как переписать SQL-запросы на Python с помощью Pandas

Автор оригинала: June Tao Ching
  • Перевод
В этой статье June Tao Ching рассказал, как с помощью Pandas добиться на Python такого же результата, как в SQL-запросах. Перед вами — перевод, а оригинал вы можете найти в блоге towardsdatascience.com.

image
Фото с сайта Unsplash. Автор: Hitesh Choudhary

Получение такого же результата на Python, как и при SQL-запросе


Часто при работе над одним проектом нам приходится переключаться между SQL и Python. При этом некоторые из нас знакомы с управлением данными в SQL-запросах, но не на Python, что мешает нашей эффективности и производительности. На самом деле, используя Pandas, можно добиться на Python такого же результата, как в SQL-запросах.

Начало работы


Нужно установить пакет Pandas, если его нет.

conda install pandas

Мы будем использовать знаменитый Датасет Титаник от Kaggle.

После установки пакета и загрузки данных нам необходимо импортировать их в наше окружение Python.

image

Для хранения данных мы будем использовать DataFrame. Управлять этой структурой данных нам помогут различные функции Pandas.

SELECT, DISTINCT, COUNT, LIMIT


Начнем с простых SQL-запросов, которые мы часто используем.

image

titanic_df["age"].unique() вернет массив уникальных значений, поэтому нам придется использовать len(), чтобы посчитать их количество.

SELECT, WHERE, OR, AND, IN (SELECT с условиями)


После первой части вы узнали, как простыми способами исследовать DataFrame. Теперь попробуем сделать это с некоторыми условиями (это оператор WHERE в SQL).

image

Если мы хотим выбрать только определенные столбцы из DataFrame, мы можем сделать это с помощью дополнительной пары квадратных скобок.

Примечание: если вы выбираете несколько столбцов, вам нужно поместить массив ["name","age"] внутри квадратных скобок.

isin() работает точно так же, как IN в SQL-запросах. Чтобы использовать NOT IN, на Python нам нужно использовать отрицание (~).

GROUP BY, ORDER BY, COUNT


GROUP BY и ORDER BY также являются популярными SQL-операторами при исследовании данных. А теперь давайте попробуем использовать их на Python.

image

Если мы хотим отсортировать только один столбец COUNT, то можем просто передать булево значение в метод sort_values. Если мы собираемся сортировать несколько столбцов, то должны передать массив булевых значений в метод sort_values.

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

MIN, MAX, MEAN, MEDIAN


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

image

SQL не содержит операторов, возвращающих медианное значение, поэтому для получения медианного значения столбца с информацией о возрасте мы используем BigQuery APPROX_QUANTILES

В Pandas метод агрегации .agg() также поддерживает другие функции, например sum.

Теперь вы научились переписывать SQL-запросы на Python с помощью Pandas. Надеюсь, эта статья будет вам полезна.

Весь код можно найти в моем репозитории Github.

Спасибо за внимание!
Plarium
Разработчик мобильных и браузерных игр

Комментарии 16

    0
    Что-то среднее между LINQ и языком запросов в MongoDB
      +4

      Код скриншотами — здорово придумано. С телефона так вообще самое то.

        +2

        а как удобно копировать чтобы попробовать у себя

        –3
        По идее можно написать утилиту (или онлайн сервис/pycharm/vs code plugin) которая принимет на вход sql, pandas dataframe/csv и генерирует исходники. Думаю многим пригодилось бы.
          0
          отличная идея
            0

            Что Вы имеете ввиду под исходниками? Данные, которые подаются на вход?

              0
              Я имею в виду что выделяем в pycharm текст

              SELECT pclass, gender, SUM( fare) FROM titanic_test_data GROUP BY 1,2

              а в буфере обмена у нас оказывается

              titanic_test_data.groupby([«pclass”,»gender"]).size()

              По идее для простых sql запросов такое создать достаточно просто.
                0

                Ну да, хорошая идея!

            +1

            А что с джойнами? Особенно интересует full outer

              +1
              И с джойнами тоже все хорошо.
              titanic_df.join(some_df, on='some_column', how='outer')

              Это если у some_df индекс совпадает с каким либо столбцом, или
              titanic_df.merge(some_df, left_on='some_columnin_table1', right_on='some_columnin_table2' how='outer')

              если это не так.
              +1
              Использую в основном pandas для анализа логов интеграции, за пару недель, когда много данных ему плоховато становится, там уж лучше идти в сторону dask. А так, да, мне с pandas проще работать, чем с SQL, сразу можно и картинку данных увидеть и данные почистить, мне нравится.
                0
                Теперь вы научились переписывать SQL-запросы на Python с помощью Pandas.

                Что будет со скоростью обработки запросов? А таблицы миллионники?
                  +2

                  Зачем очередной синтаксис? Зачем из простого делать сложное?
                  Зачем из понятной конституции "выбрать поле из таблица" делать — таблица(~таблица.поле)[@#₽&&₽#34#&&@24]? Зачем?

                    +1
                    Спасибо, давно искал!
                      0
                      SQL — это идеальный интерфейс, который существует и развивается почти 40 лет.
                      Опираясь на особенности конкретной базы данных, можно добиться идеальной производительности нужного запроса.
                      Картинки подтверждают элегантность синтаксиса SQL.
                        0
                        А ещё там в миллиард раз больше функционала, чем реализует большинство ORM.

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое