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