【问题标题】:Match each row using 3 columns conditions and return one last row only使用 3 列条件匹配每一行并仅返回最后一行
【发布时间】:2025-11-22 18:30:01
【问题描述】:

我有一个包含多个每周订单文件的合并 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 中,例如请求在 2 日开始并在 4 日结束。因为我需要买家的数量,所以我只需要其中 Product == Product 和买家 == 买家的一行,并且 summary 包含两个字符串(产品和结束)。

这是

Product    date     quantity             summary                     buyer 

AX1      4/1/2019      15            Product request ended            HTN

我再次知道它非常复杂。

【问题讨论】:

  • 如果可以的话,您可以使用 Excel 公式来执行此操作。您的上述数据会显示什么结果?
  • 最终结果应该有每个操作结束的行,我不知道 excel 中的公式可以执行该操作。请注意,该文件有 200 多个产品,并且每个月的每一天都会重复这些产品
  • 如果你有O365,你可以使用FILTER函数。或者,如果你只是想要计数,你可以使用COUNTIFS
  • 好吧,我知道如果你想要一个特定的产品和一个特定的公司,我想要的是一个列表,其中包含应用于所有产品的所有过滤器

标签: python excel pandas


【解决方案1】:

您可以像这样使用布尔条件。 (doc) 注意这段代码中的“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 项目并仅 concat all-True。

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)

【讨论】:

  • 是的 Nan 为空,这是一个很好的方法,但它如何与产品名称匹配?该产品将每周重复
  • 匹配产品名称,你的意思是,就像df[df['Product'] == 'NO6'] ?
  • 不,我的意思是如果 X 行中的产品等于 X1 行中的产品,如果是,如果同一行 x 中的买方等于产品 x1 搜索摘要中的买方并结束。是的,它已完成
  • 我已经编辑为 cols 获得相同的值。这适用于您提供的输入/输出。但不确定是否适合大桌子,请尝试。如果没有,请提供更多表格。太小了,无法理解所有复杂的情况。
  • 我更新了我原来的问题希望现在很清楚
最近更新 更多