2017-03-24 19 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としてマークします最後の行です。

ありがとうございました!

答えて

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

なしNaN制限の自由することができます! –

2

注:これはNaNを含まないSalesに依存します。それが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 

私たちは、これがまた働いていた、ありがとう。この

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

これは完璧に機能しました!今週初めに手伝ってくれてありがとう。 –

関連する問題