我的数据框包含以下数据:
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
格式。
这样做的正确方法是什么?
谢谢!
答案 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