Сравнение между группой по методике Python и разделением SQL по

#python #sql #pandas #dataframe

Вопрос:

Я хочу задать концептуальный вопрос.

У меня есть стол, который выглядит так

 UPC_CODE    A_PRICE     A_QTY    DATE       COMPANY_CODE    A_CAT
 1001        100.25       2     2021-05-06      1             PB
 1001        2122.75      10    2021-05-01      1             PB
 1002        212.75       5     2021-05-07      2             PT
 1002        3100.75      10    2021-05-01      2             PB
 

Я хочу, чтобы для каждого кода UPC и кода КОМПАНИИ были собраны последние данные.

Для достижения этой цели у меня есть SQL и Python

Использование SQL:

 WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY UPC_CODE, COMPANY_CODE ORDER BY DATE DESC) rn
FROM yourTable)

SELECT UPC_CODE, A_PRICE, A_QTY, DATE, COMPANY_CODE, A_CAT
FROM cte
WHERE rn = 1;
 

Использование Python:

 df = df.groupby(['UPC_CODE','COMPANY_CODE']).
     agg(Date = ('DATE','max'),A_PRICE = ('A_PRICE','first'),
     A_QTY = ('A_QTY','first'),A_CAT = ('A_CAT','first').reset_index()
 

В идеале я должен получить следующую результирующую таблицу:

 UPC_CODE    A_PRICE     A_QTY    DATE       COMPANY_CODE    A_CAT
 1001        100.25       2     2021-05-06      1             PB
 1002        212.75       5     2021-05-07      2             PT
 

Однако, используя SQL, я получаю вышесказанное, но это не относится к Python.

Чего мне здесь не хватает?

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

1. @Ваграм Даниен : Пожалуйста, уточните.

Ответ №1:

upc_code и date столбцы могут использоваться вместе rank(method='first',ascending = False) , например , в порядке убывания при определении первых строк, применяемая dataframe.groupby() функция после преобразования date столбца в тип даты и времени в Python, чтобы отфильтровать соответствующие строки со значением = 1 для df['rn']

 df['date']=pd.to_datetime(df['date'])
df['rn']=df.groupby('upc_code')['date'].rank(method='first',ascending = False)
print(df[df['rn']==1])