根据日期比较删除行

2024-10-03 02:45:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含以下数据的数据帧:

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的行,然后删除每个期间和公司的行

announcedate和period都是datetime格式

什么是正确的方法

谢谢


Tags: 数据示例datetimedatevalue估计值公司company
2条回答

IIUC然后就可以调用groupby对象上的^{}

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

一种方法是将数据按时段分组,然后按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]

相关问题 更多 >