首先在NaT上的groupby不像groupby中的NaN

时间:2015-07-12 22:03:45

标签: pandas

我有一个数据框,我想首先使用groupby方法收集每列的第一个时间戳。

import pandas as pd
from pandas import DataFrame
import datetime as dt

ts1 = dt.datetime.now()
ts2 = dt.datetime.now()
ts3 = dt.datetime.now()

DFdate=DataFrame([{'timestamp1':ts1,'ID':'A'},{'timestamp2':ts2,'ID':'A'},{'timestamp3':ts3,'ID':'A'}])

生成一个数据框,其中缺少的时间戳被NaT替换:

  ID              timestamp1              timestamp2              timestamp3
0  A 2015-07-12 23:19:38.044                     NaT                     NaT
1  A                     NaT 2015-07-12 23:19:38.044                     NaT
2  A                     NaT                     NaT 2015-07-12 23:19:38.044

然后在此数据框上执行groupby first方法:

DFdate.groupby('ID').first()

我出乎意料地生成了一个这样的数据框,其中NaT被选为它们出现在时间戳之前的列的第一个值:

                timestamp1 timestamp2 timestamp3
ID                                              
A  2015-07-12 23:19:38.044        NaT        NaT

我的期望是得到一些东西,其中每列具有原始数据框中列的第一个非NaT值。

                timestamp1                timestamp2                timestamp3
ID                                              
A  2015-07-12 23:19:38.044   2015-07-12 23:19:38.044   2015-07-12 23:19:38.044

以下显示表明在第一种方法的组合结果中没有使用NaN。

DFnum=DataFrame([{'Num1':1,'ID':'A'},{'Num2':2,'ID':'A'},{'Num3':3,'ID':'A'}])

此数据框中的结果:

  ID  Num1  Num2  Num3
0  A     1   NaN   NaN
1  A   NaN     2   NaN
2  A   NaN   NaN     3

执行groupby first方法会生成预期结果(结果中没有NaN):

DFnum.groupby('ID').first()

    Num1  Num2  Num3
ID                  
A      1     2     3

不应该首先只使用实时印章并跳过NaT:s?

我正在使用Pandas版本0.16.2

1 个答案:

答案 0 :(得分:1)

DFnum的结果对我来说实际上有点意外,因为我认为.first()的行为与.head(1)完全相同,因此返回第一行分组数据框1 NaN NaN是我所期待的。

尽管如此,为了满足您的需求DFdate(每列的第一个non-null值),您可以尝试以下代码。

DFdate.groupby('ID').agg(lambda col: col[col.notnull()].values[0])


                   timestamp1                 timestamp2                 timestamp3
ID                                                                                 
A  2015-07-12 23:08:26.336435 2015-07-12 23:08:26.336581 2015-07-12 23:08:26.336741