2017-07-28 23 views
2

日付と値のDataFrameがあります(以下のコードでは、日付を正しく解析していない可能性があります)。pandas:日付/値のDataFrame - >これまでの最大値のDataFrame?

import pandas as pd 
d = {'date': pd.Series(['2010-01-01', '2011-01-01', 
         '2012-01-01', '2012-07-01', 
         '2013-01-01']), 
    'value': pd.Series([0, 2, 1, 4, 3])} 
df = pd.DataFrame(d) 

私は私に「私がこれまで見てきた最大の値」(日付に関して)されている行を与えるために、このデータフレームをフィルタリングすることができる機能が欲しいです。この場合、私は3行(現在の行0,1、および3の値0,2、および4)になります。

答えて

2

'value'カラムでは、累積maxを取得し、 'value'カラムの累積最大値と 'value'カラム自体を比較し、 'value'カラムが等しい累積最大:

上記の方法には、重複する最大値が含まれます。たとえば、値が4の行が追加された場合、4つの行が両方とも出力に含まれます。

重複したくない場合は、cummaxで同様の方法を取ることができますが、cummaxが変更された行だけを保持してください。これを取得するには、累積最大値にdiffを使用して、前の値との差を求め、その差が正の値を維持します。最初の行を保つために正の値でfillnaを追加します。重複を削除する

df[df['value'].cummax().diff().fillna(1) > 0] 

Aやや単純なアプローチは、ちょうどdrop_duplicatesに続く最初のメソッドを使用することですが、あなたのデータに応じて、これは、パフォーマンスではないかもしれません。いずれかの方法を使用して、サンプル・データ用

df[df['value'].cummax() == df['value']].drop_duplicates(subset='value') 

出力結果は:

  date value 
0 2010-01-01  0 
1 2011-01-01  2 
3 2012-07-01  4 
+0

は@piRSquared:はい、ああ、ちょうどフィルタリングするために、追加のソリューションを書きました重複します。 – root

+0

これは私が 'df.iloc [[0]]と書かなければならないものです。append(df [df.value.cummax()。shift())' ...あなたの方が良いです! – piRSquared

+0

うわー、多くのありがとう。あなたのソリューションの絶え間ない改善を感謝してください! :) – jowens

関連する問題