日期字段上的数据帧groupby

2024-05-15 15:35:27 发布

您现在位置:Python中文网/ 问答频道 /正文

>>> df = pd.DataFrame(zip(np.random.rand(5).tolist(), [1]*5, [dt.date.today()]*5), columns=list('abc'))
>>> df
    a   b   c
0   0.896739    1   2017-09-24
1   0.473168    1   2017-09-24
2   0.100591    1   2017-09-24
3   0.870899    1   2017-09-24
4   0.716934    1   2017-09-24

>>> print df.groupby('c').a.apply(lambda x: x.max()).index
Index([2017-09-24], dtype='object', name=u'c')

>>> df.groupby(['b', 'c']).a.apply(lambda x: x.max()).index
MultiIndex(levels=[[1], [2017-09-24 00:00:00]], labels=[[0], [0]],
       names=[u'b', u'c'])

>>> print df.groupby(['b', 'c']).a.max().index
MultiIndex(levels=[[1], [2017-09-24]], labels=[[0], [0]],
       names=[u'b', u'c'])

为什么在第二种情况下,分组时日期字段转换为日期时间(仅限)?你知道吗

我用的是熊猫0.19.2


Tags: lambdadataframedfindexlabelsnamesnpzip
1条回答
网友
1楼 · 发布于 2024-05-15 15:35:27

实际上,只有在第二种情况下,日期字段才会转换为时间戳。在案例1和案例3中,日期字段是Datetime:

print df.groupby('c').a.apply(lambda x: x.max()).index.tolist()
print df.groupby(['b', 'c']).a.apply(lambda x: x.max()).index.tolist()

但是一个非常有趣的观察。索引和多索引以及系列.max()和系列.应用()在处理问题时似乎没有始终如一地执行datetime.date日期物体。你知道吗

解决方案:如果将dt.date.today()转换为熊猫。时间戳或者numpy.datetime64从一开始,日期字段都是一致的时间戳:

df = pd.DataFrame(list(zip(np.random.rand(5).tolist(), [1]*5, [np.datetime64(dt.date.today())]*5)), columns=list('abc'))
print(df.groupby('c').a.apply(lambda x: x.max()).index.tolist())
print(df.groupby('c').a.max().index.tolist())
print(df.groupby(['b', 'c']).a.apply(lambda x: x.max()).index.tolist())
print(df.groupby(['b', 'c']).a.max().index.tolist())

相关问题 更多 >