Как сравнить одно значение с несколькими значениями в Python с библиотекой Pandas?

В настоящее время у меня есть следующий сценарий.

Excel Data Frame =            SQL Data Frame =
________                          ________ _______ ___________ _________
|sector|                          |sector| | hour| | value_cs| value_ps|
--------                          -------- ------- ----------- ---------
 AXYZ                              AXYZ      0        78.90      87.10
 BYYT                              RACH      0        87.12      13.90
 IOPL                              IOPL      0        93.10      13.87
 XFTR                              AXYZ      1        27.90      12.87
 MANU                              IOPL      1        23.09      90.09
                                   FRES      2        34.09      12.34
                                   YYYT      2        12.43      32.98
                                   REWT      3        98.09      99.99

У меня есть один файл Excel и набор результатов SQL, и я хочу сравнить каждое значение столбца Sector из файла Excel со всеми значениями столбца Sector в результатах SQL, следовательно, если есть совпадение между значениями из этих двух столбцов затем добавьте столбцы hour, value_cs и value_ps из результатов SQL в новые кадры данных. Примечание: данные результатов SQL не имеют такой же размер, как данные файла Excel.

Желаемые результаты

 New data frame 1 for value cs
  ________ ____    ___    ___    ___    ___    ___    ___        ____                     
  |sector|  |0|    |1|    |2|    |3|    |4|    |5|    |6|   .... |23|
  -------- ----    ---    ----   ---    ---    ---    ----       ----                            
   AXYZ    78.90   27.90  78.89  54.90  98.23  85.0   45.90      68.23
   BYYT    18.94   67.10  65.69  76.32  76.56  56.03  56.23      87.65
   IOPL    93.10   23.09  34.29  97.34  34.34  14.54  34.91      23.21
   ...      ...

 New data frame 2 for value ps
  ________ ____    ___    ___    ___    ___    ___    ___        ____                     
  |sector|  |0|    |1|    |2|    |3|    |4|    |5|    |6|   .... |23|
  -------- ----    ---    ----   ---    ---    ---    ----       ----                            
   AXYZ    87.10   12.87  49.89  84.90  76.23  15.01  12.90      68.23
   BYYT    28.43   27.11  54.69  57.12  19.56  45.12  45.23      47.15
   IOPL    13.87   90.09  24.19  47.34  18.34  21.54  67.11      13.61
   ...      ...

Подход, который я использовал, заключался в том, чтобы преобразовать результаты SQL в фрейм данных, а также данные из файла Excel, но я не знаю, как выполнить сравнение без цикла for, а только с использованием Pandas (цикл for будет слишком много времени для выполнения расчетов).

import pandas as pd
import pypyodbc
from datetime import date

def get_and_compare():

    start_date = date.today()

    retrieve_values = "[DEV].[CS].[QA_Export] @start_date='{start_date:%Y-%m-%d}'".format(start_date=start_date)

    # Connect to the database
    db_connection = pypyodbc.connect(driver="{SQL Server}", server="xxx.xxx.xxx.xxx", uid="xxx",
                                         pwd="xxx", Trusted_Connection="No")

    # Get the sql result into dataframe
    data_frame_sql = pd.read_sql(retrieve_values,db_connection)


    #declare new data frames
    new_df_one = pd.DataFrame(columns=['sector', 'value cs', 'hour 0', 'hour 1', 'hour 2', 'hour 3', 'hour 4',
                                   'hour 5', 'hour 6', 'hour 7', 'hour 8', 'hour 9', 'hour 10', 'hour 11',
                                   'hour 12', 'hour 13', 'hour 14', 'hour 15', 'hour 16', 'hour 17', 'hour 18',
                                   'hour 19', 'hour 20', 'hour 21', 'hour 22', 'hour 23'])

    new_df_two = pd.DataFrame(columns=['sector', 'value ps', 'hour 0', 'hour 1', 'hour 2', 'hour 3', 'hour 4',
                                   'hour 5', 'hour 6', 'hour 7', 'hour 8', 'hour 9', 'hour 10', 'hour 11',
                                   'hour 12', 'hour 13', 'hour 14', 'hour 15', 'hour 16', 'hour 17', 'hour 18',
                                   'hour 19', 'hour 20', 'hour 21', 'hour 22', 'hour 23'])


    # Read the Excel file
    current_wb = pd.ExcelFile \
    ("C:\\U\\dev\\testing\\Main values to compare.xlsx")

    # Get the specific sheet to compare
    working_values = current_wb.parse("Main values")

    #Get the column from Excel
    sector_from_excel  = working_values['sector']

    #Comparison to perform
    #.... unknown part

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

1 ответ

Решение

Попробуй это:

def get_and_compare():

    start_date = date.today()

    retrieve_values = "[DEV].[CS].[QA_Export] @start_date='{start_date:%Y-%m-%d}'".format(start_date=start_date)

    # Connect to the database
    db_connection = pypyodbc.connect(driver="{SQL Server}", server="xxx.xxx.xxx.xxx", uid="xxx",
                                         pwd="xxx", Trusted_Connection="No")

    # Get the sql result into dataframe
    data_frame_sql = pd.read_sql(retrieve_values,db_connection)


    # Read the Excel file
    current_wb = pd.ExcelFile \
    ("C:\\U\\dev\\testing\\Main values to compare.xlsx")

    # Get the specific sheet to compare
    working_values = current_wb.parse("Main values")

    #Get the column from Excel
    sector_from_excel  = working_values['sector']

    # perform inner join between DataFrames
    # note: this requires that "sector" is a column (and not an index)
    # in both DataFrames, and that it is also named as "sector" in each
    merged_df = data_frame_sql.merge(sector_from_excel, how="inner", on="sector")

    # use "pivot" to reshape data from wide to long
    # first with value_cs
    cs_value_df = merged_df.pivot(index="sector", columns="hour", values="value_cs")

    # and then with value_ps
    ps_value_df = merged_df.pivot(index="sector", columns="hour", values="value_ps")

    # I'd suggest returning both DataFrames in a single object;
    # in this case I'm using a dict
    return {"value cs": cs_value_df, "value ps": ps_value_df}

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

Другие вопросы по тегам