Сопоставьте каждую строку с использованием условий 3 столбцов и верните только одну последнюю строку - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть объединенный файл Excel с несколькими файлами еженедельных заказов

import pandas as pd


Jan1 = pd.read_excel(r"~\Documents\1to6janReport1.xlsx")
Jan2 = pd.read_excel(r"~\Documents\7to12janReport2.xlsx")
Jan3 = pd.read_excel(r"~\Documents\13to19janReport3.xlsx")
Jan4 = pd.read_excel(r"~\Documents\20to26janReport4.xlsx")

all_df_list = [Jan1, Jan2, Jan3,Jan4]


appended_df = pd.concat(all_df_list)

appended_df.to_excel("SallesDB1.xlsx", index=False)

И структура файла выглядит следующим образом

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

Где, если продукт равен равному товару, а покупатель не равен нулю, а равный покупатель возвращает только строку, в которой в сводке содержатся слова «продукт» и «окончено».

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

Конечный результат должен выглядеть следующим образом

Product    date     quantity             summary                     buyer 
NO6      2/1/2019      6       Operation product request ended        KLW
ZS5      3/1/2019      5          The product request ended           WHM

Обновление

Product    date     quantity             summary                     buyer 
*day1*
AX1      2/1/2019      15     The product request started today       HTN
X5L      2/1/2019      0            No operation update               null
NO6      2/1/2019      6       Operation product request ended        KLW
ZS5      2/1/2019      5         The product request started          WHM
*day2*
AX1      3/1/2019      15        Product request still pending        HTN
X5L      3/1/2019      5         A new product request started        LKJ
NO6      3/1/2019      0           No update for operation            null
ZS5      3/1/2019      5          The product request ended           WHM
*day3*
AX1      4/1/2019      15            Product request ended            HTN
X5L      4/1/2019      5       The product request under-process      LKJ
NO6      4/1/2019      0           No update for operation            null
ZS5      4/1/2019      3      New request for the product started     KLW

Таким образом, в таблице данных (в Excel) более 200 продуктов. Эти продукты будут повторяться каждый день. Резюме для каждого продукта отличается каждый день.

Но что мне действительно нужно, так это номер запроса покупателя (количество).

В продукте AX1 , например, запрос, начатый в 2ed и закончился на 4-м. Так как мне нужно количество покупателей, мне понадобится только одна строка, в которой Product == Product и покупатель == покупатель, а в сводке содержатся обе строки (товар и окончание).

То есть

Product    date     quantity             summary                     buyer 

AX1      4/1/2019      15            Product request ended            HTN

Опять же я знаю, что это очень завершено.

1 Ответ

0 голосов
/ 04 февраля 2020

Вы можете использовать логическое условие, как это. (do c) Примечание. В этом коде 'Nan' - это просто строка.

newdf= df[(df['buyer'] != 'Nan') 
           & df['summary'].str.contains('product')
           & df['summary'].str.contains('ended')
         ]

Если значение Nan в df['buyer'] равно None, вы можете использовать df.dropna() .


Редактировать

Чтобы подтвердить, что df ['Product'] имеют одинаковое значение, а df ['покупатель'] имеют одинаковое значение, зацикливается для всех элементов col и конкат только по-Истинному.

p_items = pd.unique(df['Product'])
b_items = pd.unique(df['buyer'])

newdf = pd.DataFrame([], columns=['Product', 'date', 'quantity', 'summary', 'buyer'])

for p_item in p_items:
    for b_item in b_items:
        tmp_df = df[
           (df['buyer'] != 'Nan')
           & (df['Product'] == p_item) 
           & (df['buyer'] == b_item)
           & df['summary'].str.contains('product')
           & df['summary'].str.contains('ended')]

        if len(tmp_df):
            newdf = pd.concat([newdf, tmp_df], sort=False)

print(newdf)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...