使用3列条件匹配每一行,并仅返回最后一行

时间:2020-02-04 12:08:02

标签: python excel pandas

我有多个每周订单文件合并的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)

文件结构如下

我想要返回一个新的数据框来计算每个买家的订单。

如果产品等于产品,而购买者不为null,并且等于购买者,则仅返回汇总中包含“产品”和“终止”的行。

我知道这很复杂,但是我需要获取每个买方订单的百分比(计算订单而不是数量)。问题在于同一产品每天都会出现,并带有一天的摘要,其中请求可能需要一天或几天才能结束,这会造成不正确的百分比。 同样,在购买者的订单结束之后,新的购买者可以订购相同的产品,或者同一购买者将开始新的订购,这是唯一知道使用摘要(start,end)作为关键字的方法。

最终结果应该像这样

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 中,请求从第2个开始,在第4个结束。由于我需要购买者的数量,因此我只需要一行,其中产品==产品和购买者==买方,并且摘要包含两个字符串(产品和结束)。

哪个

Product    date     quantity             summary                     buyer 

AX1      4/1/2019      15            Product request ended            HTN

再次,我知道它非常专心。

1 个答案:

答案 0 :(得分:0)

您可以像这样使用布尔条件。 enter image description here请注意,此代码中的“ Nan”只是一个字符串。

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

如果df['buyer']中的Nan是None,则可以使用df.dropna()


修改

要确认df ['Product']具有相同的值,并且df ['buyer']具有相同的值,将对所有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)