查找日期范围内的最大日期,而无需在Python中进行过滤

时间:2018-12-24 19:12:06

标签: python pandas pandas-groupby

我有一个文件,每个EMID在每个生效日期都有一行。我需要找到在特定日期之前发生的每个EMID的最大生效日期。例如,如果EMID = 1包含4行,则1行代表1/1 / 16,1行代表10/1 / 16,1行代表12/1 / 16,1行代表12/2/17,我选择日期1 / 1/17作为我的特定日期,我想知道12/1/16是EMID = 1的最大日期,发生于1/1/17之前。

我知道如何通过EMID(groupby.max())查找整体的最大日期。我还可以将文件过滤为17年1月1日之前的日期,并找到剩余行的最大值。但是,最终我需要在1/1/17之前的最后一行,然后在1/1/17之后的所有行,所以滤除在日期之后出现的行不是最佳的,因为那样我就必须进行复杂的联接让他们回来。

# Create dummy data
dummy = pd.DataFrame(columns=['EmID', 'EffectiveDate'])
dummy['EmID'] = [random.randint(1, 10000) for x in range(49999)]
dummy['EffectiveDate'] = [np.random.choice(pd.date_range(datetime.datetime(2016,1,1), datetime.datetime(2018,1,3))) for i in range(49999)]

#Create group by 
g = dummy.groupby('EmID')['EffectiveDate']
# This doesn't work, but effectively shows what I'm trying to do
dummy['max_prestart'] = max(dt for dt in g if dt < datetime(2017,1,1))

我希望输出是数据框中的附加列,该列具有在指定日期之前发生的最大日期。

1 个答案:

答案 0 :(得分:0)

在选定后使用map

s=dummy.loc[dummy.EffectiveDate>'2017-01-01'].groupby('EmID').EffectiveDate.max()
dummy['new']=dummy.EmID.map(s)

在这里使用transform并假设else dt

dummy['new']=dummy.loc[dummy.EffectiveDate>'2017-01-01'].groupby('EmID').EffectiveDate.transform('max')
dummy['new']=dummy['new'].fillna(dummy.EffectiveDate)