Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫-按日期识别最后一行_Python_Pandas_Group By_Shift - Fatal编程技术网

Python 熊猫-按日期识别最后一行

Python 熊猫-按日期识别最后一行,python,pandas,group-by,shift,Python,Pandas,Group By,Shift,我试图在熊猫数据框架中完成两件事: 根据新的DateCompleted创建新列最后一行('Yes'或'No') 捕获当前行上的下一个事务,除非它是新的DateCompleted(在这种情况下标记为Null) 原始数据集 DateCompleted TranNumber Sales 0 1/1/17 10:15AM 3133 130.31 1 1/1/17 11:21AM 3531 103.12

我试图在熊猫数据框架中完成两件事:

  • 根据新的DateCompleted创建新列最后一行('Yes'或'No')
  • 捕获当前行上的下一个事务,除非它是新的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 
    
    期望输出

            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
    
    我可以根据以下信息获得下一笔交易:

     df['NextTranSales'] = df.Sales.shift(-1)
    
    但是我很难确定DateCompleted组中的最后一行,如果它是最后一行,则将NextTranSales标记为Null


    谢谢你的帮助

    如果数据帧已按DateCompleted列排序,则可能只需要
    groupby.shift

    date = pd.to_datetime(df.DateCompleted).dt.date    
    df["NextTranSales"] = df.groupby(date).Sales.shift(-1)
    

    如果需要
    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
    
    注意:这取决于
    Sales
    没有
    NaN
    。如果它有任何
    NaN
    ,我们将得到最后一行的错误判断。之所以会出现这种情况,是因为我利用了移位列在最后一个位置留下一个
    NaN
    的便利性

    d = df.DateCompleted.dt.date
    m = {True: 'Yes', False: 'No'}
    s = df.groupby(d).Sales.shift(-1)
    df = df.assign(NextTranSales=s).assign(LastRow=s.isnull().map(m))
    print(df)
    
            DateCompleted  TranNumber   Sales  NextTranSales LastRow
    0 2017-01-01 10:15:00        3133  130.31         103.12      No
    1 2017-01-01 11:21:00        3531  103.12          99.23      No
    2 2017-01-01 12:31:00        3652   99.23            NaN     Yes
    3 2017-01-02 09:31:00        3689   83.22          29.93      No
    4 2017-01-02 10:31:00        3701   29.93            NaN     Yes
    5 2017-01-03 08:30:00        3709   31.31            NaN     Yes
    

    我们可以不受
    NaN
    的限制

    d = df.DateCompleted.dt.date
    m = {True: 'Yes', False: 'No'}
    s = df.groupby(d).Sales.shift(-1)
    l = pd.Series(
        'Yes', df.groupby(d).tail(1).index
    ).reindex(df.index, fill_value='No')
    df.assign(NextTranSales=s).assign(LastRow=l)
    
            DateCompleted  TranNumber   Sales  NextTranSales LastRow
    0 2017-01-01 10:15:00        3133  130.31         103.12      No
    1 2017-01-01 11:21:00        3531  103.12          99.23      No
    2 2017-01-01 12:31:00        3652   99.23            NaN     Yes
    3 2017-01-02 09:31:00        3689   83.22          29.93      No
    4 2017-01-02 10:31:00        3701   29.93            NaN     Yes
    5 2017-01-03 08:30:00        3709   31.31            NaN     Yes
    

    那很有效!再次感谢您在本周早些时候帮助我:)