根据日期比较删除行

时间:2015-10-02 14:43:50

标签: python pandas

我的数据框包含以下数据:

Estimate     Value       Announce date      Period       Company
Estimate 1:  0,24        01-01-2015         31-12-2015     X
Estimate 2:  0,22        08-04-2015         31-12-2015     X
Estimate 3   0,26        07-05-2015         31-12-2014     Y
Estimate 4:  0,29        21-09-2015         31-12-2014     Y
Estimate 5:  0,21        30-09-2015         31-12-2013     Z

我想仅包含最早估算每期公司

示例:公司x在2015年12月31日期间有两个估计值,1和2,但估计值1具有比估计值2更早的公告日期。所以我想删除估计值为2的行,然后这个对于每个时期和公司。

宣布日期和期间均为datetime格式。

这样做的正确方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

一种方法是按期间对数据进行分组,然后进行排名,然后是Rank = 1的子集:

from io import StringIO
import pandas as pd

s = u"""Estimate Value AnnounceDate Period Company
Estimate1: 0,24 01-01-2015 31-12-2015 X
Estimate2: 0,22 08-04-2015 31-12-2015 X
Estimate3: 0,26 07-05-2015 31-12-2014 Y
Estimate4: 0,29 21-09-2015 31-12-2014 Y
Estimate5: 0,21 30-09-2015 31-12-2013 Z"""

df = pd.read_csv(StringIO(s), delimiter=" ")
df['Rank'] = df.groupby(['Period','Company'])['AnnounceDate'].rank(ascending=True)
df[df['Rank']==1]

答案 1 :(得分:1)

IIUC然后您可以在groupby对象上调用first

In [191]:
df.groupby(['Period','Company']).first()

Out[191]:
                      Estimate Value AnnounceDate
Period     Company                               
2013-12-31 Z        Estimate5:  0,21   2015-09-30
2014-12-31 Y        Estimate3:  0,26   2015-07-05
2015-12-31 X        Estimate1:  0,24   2015-01-01

如果要对结果进行排序,请在groupby之前对df进行排序:

In [194]:
df.sort(columns='AnnounceDate').groupby(['Period','Company']).first()

Out[194]:
                      Estimate Value AnnounceDate
Period     Company                               
2013-12-31 Z        Estimate5:  0,21   2015-09-30
2014-12-31 Y        Estimate3:  0,26   2015-07-05
2015-12-31 X        Estimate1:  0,24   2015-01-01