【问题标题】:groupby first on NaT not like NaN in groupbygroupby 首先在 NaT 上不像在 groupby 中的 NaN
【发布时间】:2015-07-13 06:21:36
【问题描述】:

我有一个数据框,我想首先使用 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

下图显示了在 groupby first 方法的结果中没有使用 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

groupby 不应该首先只使用实时时间戳并跳过 NaT:s 吗?

我使用的是 Pandas 0.16.2 版

【问题讨论】:

    标签: pandas


    【解决方案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
    

    【讨论】:

    • 正如您提到的 head(1) 的使用,我注意到了这一点。 DFdate.groupby('ID').agg(lambda col: col[col.notnull()].head(1)) 似乎也给出了相同的结果。
    • @Wurdius 是的,每一列上的head(1) 也给出了相同的结果。
    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多