熊猫:groupby 和转换与日期时间

Posted

技术标签:

【中文标题】熊猫:groupby 和转换与日期时间【英文标题】:Pandas: groupby and transform with datetime 【发布时间】:2015-11-05 05:28:35 【问题描述】:

我仍然是 pandas 的初学者,当我对多个列(包括 dtype datetime64[ns] 列)使用 groupby-transform 操作时,我偶然发现了一个非常奇怪的行为。

我的(玩具)例子是:

import pandas as pd
df = pd.DataFrame('date': [pd.datetime(2014,3,17),    pd.datetime(2014,3,24), pd.datetime(2014,3,17)], 'hdg_id': [4041,4041,4041],'stock': [1.0,1.0,1.0])

In[117]: df
Out[117]: 
    date  hdg_id  stock
0 2014-03-17    4041      1
1 2014-03-24    4041      1
2 2014-03-17    4041      1

我现在按日期和hdg_id分组(对于hdg_id来说很简单,因为只有一个唯一值,但我需要多次分组才能产生结果,我的实际应用当然更复杂):

In[118]: df.groupby(['date', 'hdg_id']).transform(sum)
Out[118]: 
           stock
0   0.000000e+00
1  4.940656e-324
2   0.000000e+00

这不是我的预期结果。如果我将列日期转换为类型字符串,我会得到我所期望的:

In[129]: df['date']=df['date'].astype(str)
In[131]: df.groupby(['date', 'hdg_id']).transform(sum)
Out[131]: 
   stock
0      2
1      1
2      2

任何人都可以分享一些内部情况吗?

非常感谢!

【问题讨论】:

这对我来说似乎是一个错误,如果分组的列不是日期时间,那么它按预期工作,同样,如果您按这些列设置索引,那么它按预期工作 似乎是一个已知错误,将在下一个版本中修复:github.com/pydata/pandas/pull/10124 @John 和 Ed:非常感谢,这至少在某些方面很有帮助:)。 【参考方案1】:

是否有理由使用 .transform(sum)?

你可以这样做: df.groupby(['date', 'hdg_id']).sum()

【讨论】:

感谢您的回答,但我需要转换,因为我需要保留原始数据帧以供进一步处理。

以上是关于熊猫:groupby 和转换与日期时间的主要内容,如果未能解决你的问题,请参考以下文章

根据不均匀的日期重新索引熊猫数据框,然后用 groupby 和空白填充某些值

熊猫:Groupby,循环并添加一小时迭代与组内的条件

将字符串日期时间转换为熊猫日期时间

如何在groupby期间将日期字符串转换为agg函数中的日期时间

熊猫用字符串转换日期

熊猫用字符串转换日期