2017-07-28 46 views
2

我有一個DataFrame的日期和值(在下面的代碼中,我可能沒有正確解析日期)。熊貓: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'列上使用cummax獲取累計最大值,然後將'value'列的累計最大值與'value'列本身進行比較,並且只保留'value'列等於其值的行累計最大值:

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

請注意,上述方法將包含重複最大值。例如,如果有一個值爲4的附加行,那麼包含4的兩行都將包含在輸出中。

如果您不想重複,可以採用與cummax類似的方法,但只保留cummax更改的行。爲了得到這個,使用累計最大值diff來獲得與之前值的差值,並保持差值爲正值的位置。添加fillna與正值保持第一排:

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

稍微簡單的方法來刪除重複的是隻用第一種方法,隨後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