2017-11-28 33 views
1

を探して値の最初のインスタンスを探す:私は次のようなデータフレームを持っているパンダのデータフレームに後方

Timestamp Value 
11/23/2017 7 
11/24/2017 3 
11/25/2017 5 
11/26/2017 7 
11/27/2017 7 
11/28/2017 7 

私は上向き、最後の値、7の最初のインスタンスを返す何かを書きたいです、値が何かに変わると停止します。したがって、サンプルのデータフレームへの答えは11/26/2017である必要があります。

私はdrop_duplicatesにしようとしましたが、タイムスタンプ11/23/2017の最初の行を返します。

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

答えて

2

locによってidxmax、最後の選択値で最大値のインデックスを取得し、コラムValueのユニークな連続する値を取得するためのヘルパーSeriesを作成します。

print (df) 
    Timestamp Value 
0 11/23/2017  7 
1 11/24/2017  3 
2 11/25/2017  5 
3 11/26/2017  7 
4 11/27/2017  7 
5 11/28/2017  7 

a = df['Value'].ne(df['Value'].shift()).cumsum() 
b = df.loc[a.idxmax(), 'Timestamp'] 
print (b) 
11/26/2017 

詳細:

print (a) 
0 1 
1 2 
2 3 
3 4 
4 4 
5 4 
Name: Value, dtype: int32 

の場合最初の列はmaxのインデックス値が必要なので、インデックスソリューションはより簡単ですSeries:600.000行DFため

print (df) 
      Value 
Timestamp   
11/23/2017  7 
11/24/2017  3 
11/25/2017  5 
11/26/2017  7 
11/27/2017  7 
11/28/2017  7 

b = df['Value'].ne(df['Value'].shift()).cumsum().idxmax() 
print (b) 
11/26/2017 
+1

スピード;-)テスト用 – MaxU

+0

感謝を比較するために興味深いものになるだろう!私はちょうど600.000行DFに対してそれをテストしました - 私のソリューションは少し速かった... ;-) – MaxU

+0

'4ms'?これは同じです;) – jezrael

2
In [173]: df.iat[df.loc[::-1, 'Value'].diff().fillna(0).ne(0).idxmax()+1, 
       df.columns.get_loc('Timestamp')] 
Out[173]: '11/26/2017' 

タイミング

In [201]: df = pd.concat([df] * 10**5, ignore_index=True) 

In [202]: %%timeit 
    ...: df['Value'].ne(df['Value'].shift()).cumsum().idxmax() 
    ...: 
15.3 ms ± 646 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

In [203]: %%timeit 
    ...: df.iat[df.loc[::-1, 'Value'].diff().fillna(0).ne(0).idxmax()+1, 
    ...:  df.columns.get_loc('Timestamp')] 
    ...: 
11.6 ms ± 237 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 
関連する問題