Pandas - 按日期识别最后一行

Wal*_*eed 5 python group-by shift pandas

我试图在 Pandas 数据框中完成两件事:

  1. 根据新的 DateCompleted创建新列Last Row (“是”或“否”)
  2. 捕获当前行的下一个事务,除非它是新的 DateCompleted(在这种情况下标记为 Null)。

原始数据集

        DateCompleted      TranNumber  Sales

    0   1/1/17 10:15AM     3133         130.31
    1   1/1/17 11:21AM     3531         103.12  
    2   1/1/17 12:31PM     3652         99.23  
    3   1/2/17 9:31AM      3689         83.22
    4   1/2/17 10:31AM     3701         29.93
    5   1/3/17 8:30AM      3709         31.31 
Run Code Online (Sandbox Code Playgroud)

所需输出

        DateCompleted      TranNumber   Sales    NextTranSales  LastRow

    0   1/1/17 10:15AM     3133         130.31   103.12         No
    1   1/1/17 11:21AM     3531         103.12   99.23          No
    2   1/1/17 12:31PM     3652         99.23    NaN            Yes
    3   1/2/17 9:31AM      3689         83.22    29.93          No 
    4   1/2/17 10:31AM     3701         29.93    NaN            Yes
    5   1/3/17 8:30AM      3709         31.31    ...            No
Run Code Online (Sandbox Code Playgroud)

我可以根据以下内容获取 NextTranSales:

 df['NextTranSales'] = df.Sales.shift(-1)
Run Code Online (Sandbox Code Playgroud)

但我无法确定 DateCompleted 组中的最后一行,并且如果它是最后一行,则无法将 NextTranSales 标记为 Null。

感谢您的帮助!

Psi*_*dom 5

如果您的数据框已按DateCompleted列排序,那么您可能只需要groupby.shift

date = pd.to_datetime(df.DateCompleted).dt.date    
df["NextTranSales"] = df.groupby(date).Sales.shift(-1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果您需要该LastRow列,您可以找到最后一行索引groupby,然后分配yes给行:

last_row_index = df.groupby(date, as_index=False).apply(lambda g: g.index[-1])
df["LastRow"] = "No"
df.loc[last_row_index, "LastRow"] = "Yes"
df
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述