熊猫从组中获取列的第一个和最后一个值

Dav*_*vid 4 python date dataframe pandas

嗨,我有dataframe多个包含相同ID的行。列之一是日期(升序)。我想计算第一个条目和最后一个条目之间的日期差。

我通过实例化pandas构造函数来做到这一点,如下所示:

g = df.groupby('ID')

print(pd.DataFrame({'first':g.Date.nth(0), 'last':g.Date.nth(-1)}))
Run Code Online (Sandbox Code Playgroud)

第一个值正确,但是最后一个值远不正确。

例如,对于特定ID,first dateis 2000-05-08last dateis是8/21/2010。输出结果为:

               first       last
ID                         
31965.0        2000-05-08  2002-12-29
Run Code Online (Sandbox Code Playgroud)

2002-12-29 在中间的某个地方。

样本数据:

ID  Date
31965   5/8/2000
31965   5/10/2000
31965   5/18/2000
31965   5/22/2000
31965   5/23/2000
31965   5/25/2000
31965   5/30/2000
31965   6/7/2000
31965   6/8/2000
31965   6/11/2000
31965   6/13/2000
.....
31965   4/11/2009
31965   5/9/2009
31965   5/16/2009
31965   5/23/2009
31965   2/5/2010
31965   2/26/2010
31965   3/13/2010
31965   4/10/2010
31965   8/21/2010
Run Code Online (Sandbox Code Playgroud)

我希望ID 31965的结果为:5/8/2000和8/21/2010,以便最终确定日期差。

Sco*_*ton 5

您可以一步一步完成此操作,请确保“日期”列为dtype datetime,

df['Date'] = pd.to_datetime(df['Date'])

df.groupby('ID')['Date'].agg(['first','last'])
Run Code Online (Sandbox Code Playgroud)

现在,我怀疑您的数据可能未正确排序,但是如果您仍然希望最早和最晚日期,可以执行以下操作:

df.groupby('ID')['Date'].agg(['min','max']).rename(columns={'min':'first','max':'last'})
Run Code Online (Sandbox Code Playgroud)

或者您可以使用sort_values:

df.sort_values('Date').groupby('ID')['Date'].agg(['first','last'])
Run Code Online (Sandbox Code Playgroud)