我有一个日期和值的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)
我想要一个可以过滤这个DataFrame的函数,只给我一些"到目前为止我看到的最大值" (关于日期)。在这种情况下,我最终会得到3行(当前行0,1和3,值为0,2和4)。
答案 0 :(得分:2)
在“值”列上使用cummax
获取累计最大值,然后将“值”列的累计最大值与“值”列本身进行比较,并仅将行保留在“值”列中等于其累积最大值:
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