面板数据:对每组进行第一次观察,重复行并调整某些值



我有一个大的Pandas数据帧,看起来如下(85k行(:

df1 = pd.DataFrame({"ID": [1, 1, 
2, 
3, 3, 3],          
"BEGDT": [pd.to_datetime("1986-01-01"), pd.to_datetime("1989-01-01"),
pd.to_datetime("1988-01-01"),
pd.to_datetime("1983-01-01"), pd.to_datetime("1986-01-01"), pd.to_datetime("1987-01-01")],
"ENDDT": [pd.to_datetime("1988-12-31"), pd.to_datetime("1989-12-31"),
pd.to_datetime("1990-12-31"),
pd.to_datetime("1985-12-31"), pd.to_datetime("1986-12-31"), pd.to_datetime("1990-12-31")],
"Inception": [pd.to_datetime("1984-12-04"), pd.to_datetime("1984-12-04"),
pd.to_datetime("1987-06-07"),
pd.to_datetime("1982-05-08"), pd.to_datetime("1982-05-08"), pd.to_datetime("1982-05-08")],   
"NAME": ["Juan", "Jerome",
"Pedro",
"Javier", "Pastor", "Daniel"]})

我的目标如下:对于BEGDT > Inception所在的每个ID的第一次观察,复制该行,并将最初复制的行的BEGDT更改为Inception,将ENDDT更改为BEGDT - 1 day

因此,最终输出应如下所示:


df2 = pd.DataFrame({"ID": [1, 1, 1,
2, 2,
3, 3, 3, 3],          
"BEGDT": [pd.to_datetime("1984-12-04"), pd.to_datetime("1986-01-01"), pd.to_datetime("1989-01-01"),
pd.to_datetime("1987-06-07"), pd.to_datetime("1988-01-01"),
pd.to_datetime("1982-05-08"), pd.to_datetime("1983-01-01"), pd.to_datetime("1986-01-01"), pd.to_datetime("1987-01-01")],
"ENDDT": [pd.to_datetime("1985-12-31"), pd.to_datetime("1988-12-31"), pd.to_datetime("1989-12-31"),
pd.to_datetime("1987-12-31"), pd.to_datetime("1990-12-31"),
pd.to_datetime("1982-12-31"), pd.to_datetime("1985-12-31"), pd.to_datetime("1986-12-31"), pd.to_datetime("1990-12-31")],
"Inception": [pd.to_datetime("1984-12-04"), pd.to_datetime("1984-12-04"), pd.to_datetime("1984-12-04"),
pd.to_datetime("1987-06-07"), pd.to_datetime("1987-06-07"),
pd.to_datetime("1982-05-08"), pd.to_datetime("1982-05-08"), pd.to_datetime("1982-05-08"), pd.to_datetime("1982-05-08")],   
"NAME": ["Juan", "Juan", "Jerome",
"Pedro", "Pedro",
"Javier", "Javier", "Pastor", "Daniel"]})

我假设,首先,我必须用df1.groupby("ID").first()对数据进行分组,然后进行计算,最后,将这些行插入df1中。然而,我不确定这是否是最好的方法

如有任何帮助,我们将不胜感激。

编辑值可以在数据帧的副本(我们称之为tmp(上完成,以加快处理速度,而不是在每个单独组的groupby内完成。然后,我们可以按照BEGDT > Inceptiongroupby.first进行筛选,就像您所说的,获取索引值,从副本中提取这些行,并将两者组合起来:

tmp = df1.copy()
tmp['ENDDT'] = tmp.BEGDT - pd.Timedelta('1 day')
tmp['BEGDT'] = tmp.Inception
(pd.concat([
df1, 
tmp.loc[
df1[df1.BEGDT > df1.Inception]
.reset_index()
.groupby('ID')
.first()['index']]])
.reset_index(drop=True)
.sort_values(by='ID')
)

最新更新