gpt4 book ai didi

python - 在时间戳/日期时间/日期时间64类型的列上运行groupby时如何正确使用pandas agg函数?

转载 作者:太空宇宙 更新时间:2023-11-03 17:30:25 24 4
gpt4 key购买 nike

我试图理解为什么直接在一个组上调用 count() 会返回正确的答案(在本例中,该组中有 2 行),但通过 agg() 函数中的 lambda 调用 count 会返回纪元(“1970-01-01 00:00:00.000000002”)。

# Using groupby(lambda x: True) in the code below just as an illustrative example.
# It will always create a single group.
x = DataFrame({'time': [np.datetime64('2005-02-25'), np.datetime64('2006-03-30')]}).groupby(lambda x: True)

display(x.count())
>>time
>>True 2

display(x.agg(lambda x: x.count()))
>>time
>>True 1970-01-01 00:00:00.000000002

这可能是 pandas 中的一个错误吗?我在用 Pandas 版本:0.16.1IPython版本:3.1.0numpy 版本:1.9.2

无论我使用标准 python datetime、np.datetime64 还是 pandas Timestamp,我都会得到相同的结果。

编辑(根据 @jeff 接受的答案,看起来我可能需要在应用不返回日期时间类型的聚合函数之前强制转换为 dtype 对象):

dt = [datetime.datetime(2012, 5, 1)] * 2
x = DataFrame({'time': dt})
x['time2'] = x['time'].astype(object)
display(x)
y = x.groupby(lambda x: True)
y.agg(lambda x: x.count())

>>time time2
>>True 1970-01-01 00:00:00.000000002 2

最佳答案

这里 x 是上面的原始框架(不是你的 groupby)。传递 UDF,例如lambda,在每个系列上调用它。这就是函数的结果。

In [35]: x.count()
Out[35]:
time 2
dtype: int64

然后会强制转换为系列的原始数据类型。所以结果是:

In [36]: Timestamp(2)
Out[36]: Timestamp('1970-01-01 00:00:00.000000002')

这正是您所看到的。强制转换为原始数据类型的目的是尽可能保留它。不这样做会对 groupby 结果产生更大的影响。

关于python - 在时间戳/日期时间/日期时间64类型的列上运行groupby时如何正确使用pandas agg函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31929585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com