Published on

July 13, 2021

Понимание объединений SQL Server в Python

При работе с несколькими наборами данных в среде Python вам может потребоваться объединить их с помощью операций объединения. В этом руководстве мы рассмотрим различные способы объединения данных в Python с использованием концепций SQL Server. Мы обсудим метод объединения pandas, метод объединения pandas и библиотеку pandasql.

Объединение pandas

Метод объединения pandas позволяет объединить два набора данных на основе общего столбца. Вы можете указать тип объединения (например, внутреннее, внешнее, левое, правое) и столбец для объединения. Вот пример:

order_details = pd.read_csv('data\SalesOrderDetail.csv')
order_headers = pd.read_csv('data\SalesOrderHeader.csv')
orders = order_headers.merge(order_details,
                    how='left',
                    on='SalesOrderID')

Вы также можете передать дополнительные параметры в метод объединения, такие как суффиксы для перекрывающихся имен столбцов, столбец-индикатор для указания источника каждой строки и аргумент проверки для проверки типа объединения. Однако имейте в виду, что объединение не поддерживает условия и может привести к неожиданным результатам, если оба ключевых столбца имеют пустые значения.

Объединение pandas

Метод объединения pandas похож на объединение, но он более подходит, когда у вас определен индекс в ваших наборах данных. Вы можете объединить наборы данных на основе их индексов. Вот пример:

products = pd.read_csv('data\Product.csv')
products.set_index('ProductID', inplace=True)

order_details = pd.read_csv('data\SalesOrderDetail.csv')
order_details.set_index('SalesOrderID', inplace=True)

order_headers = pd.read_csv('data\SalesOrderHeader.csv')
order_headers.set_index('SalesOrderID', inplace=True)

orders = order_headers.join(order_details,
                       how='inner',
                       lsuffix='_oh',
                       rsuffix='_od')

orders.reset_index(inplace=True)
orders.set_index('ProductID', inplace=True)

orders_and_products = orders.join(products,
                                  how='inner')

Метод объединения быстрее, чем объединение при работе с индексами, но вам нужно быть осторожным, чтобы сбросить индекс и установить новый, чтобы получить правильные результаты. Как и объединение, объединение не поддерживает условия.

pandasql

Библиотека pandasql позволяет выполнять запросы к наборам данных с использованием синтаксиса SQL. Вы можете написать SQL-запросы для объединения нескольких наборов данных и выбора необходимых столбцов. Вот пример:

pysqldf = lambda q: sqldf(q, globals())

query = '''
    SELECT oh.SalesOrderID,
           od.SalesOrderID,
           oh.TotalDue,
           SalesOrderDetailID,
           OrderQty,
           od.ProductID,
           UnitPrice,
           UnitPriceDiscount,
           LineTotal,
           Name
      FROM order_details od
      JOIN products p ON od.ProductID = p.ProductID
      JOIN order_headers oh ON od.SalesOrderID = oh.SalesOrderID
    '''
orders_and_products = pysqldf(query)

pandasql предоставляет интуитивно понятный и знакомый синтаксис объединения SQL, позволяя объединять несколько наборов данных одновременно и определять сложные условия объединения. Однако имейте в виду, что SQL-запросы в виде строк могут быть сложными для отладки, и пакет pandasql больше не поддерживается.

Вывод

В этом руководстве мы рассмотрели три различных способа объединения наборов данных в Python: с использованием метода объединения pandas, метода объединения pandas и библиотеки pandasql. Объединение является самым быстрым и удобным методом, особенно при работе с индексами наборов данных. Объединение позволяет также использовать столбцы без индекса. pandasql предлагает удобный синтаксис на основе SQL, но может иметь более медленное время выполнения. Выберите метод, который лучше всего подходит для ваших потребностей, исходя из размера и структуры ваших наборов данных.

Статья обновлена: 2023-06-16

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.