2017-03-24 162 views
2

確定最後一行我想完成我的熊貓數據幀兩件事情:熊貓 - 按日期

  1. 基於新DateCompleted
  2. 創建列 新的最後一行(「是」或「否」)
  3. 捕獲當前行上的下一個事務,除非它是新的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 

我可以得到一個基於NextTranSales:

df['NextTranSales'] = df.Sales.shift(-1) 

但我無法確定最後一行DateCompleted組並將NextTranSales標記爲Null(如果它爲null)是最後一行。

感謝您的幫助!

回答

3

如果數據幀已經被DateCompleted列進行排序,那麼你可能只需要groupby.shift

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

enter image description here

如果您需要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 

enter image description here

+0

謝謝,這也是工作! –

2

注:這取決於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 
+0

完美的工作!再次感謝您幫助我 - 您在本週早些時候提供了幫助:) –