3

我遇到了一个属性,我发现在pandas. 这是一些时间序列数据:

import pandas as pd
import numpy as np

dr = pd.date_range('01-01-2020 5:00', periods=10, freq='H')
df = pd.DataFrame({'Bools':[True,True,False,False,False,True,True,np.nan,np.nan,False],
                   "Nums":range(10)},
                  index=dr)

所以数据看起来像:

                     Bools  Nums
2020-01-01 05:00:00   True     0
2020-01-01 06:00:00   True     1
2020-01-01 07:00:00  False     2
2020-01-01 08:00:00  False     3
2020-01-01 09:00:00  False     4
2020-01-01 10:00:00   True     5
2020-01-01 11:00:00   True     6
2020-01-01 12:00:00    NaN     7
2020-01-01 13:00:00    NaN     8
2020-01-01 14:00:00  False     9

我原以为我可以在重新采样时对布尔列执行简单的操作(如求和),但是(原样)这失败了:

>>> df.resample('5H').sum()

                    Nums
2020-01-01 05:00:00    10
2020-01-01 10:00:00    35

“布尔”列被删除。我对为什么会发生这种情况的印象是 b/cdtype列的object. 更改以解决问题:

>>> r = df.resample('5H')
>>> copy = df.copy() #just doing this to preserve df for the example
>>> copy['Bools'] = copy['Bools'].astype(float)
>>> copy.resample('5H').sum()

                     Bools  Nums
2020-01-01 05:00:00    2.0    10
2020-01-01 10:00:00    2.0    35

但是(奇怪的是)您仍然可以通过索引重新采样对象而不更改布尔值来求和dtype

>>> r = df.resample('5H')
>>> r['Bools'].sum()

2020-01-01 05:00:00    2
2020-01-01 10:00:00    2
Freq: 5H, Name: Bools, dtype: int64

而且,如果唯一的列是布尔值,您仍然可以重新采样(尽管该列仍然是object):

>>> df.drop(['Nums'],axis=1).resample('5H').sum()

                    Bools
2020-01-01 05:00:00      2
2020-01-01 10:00:00      2

是什么让后两个示例起作用?我可以看到它们可能更明确一点(“拜托,我真的想重新采样此列!”),但我不明白为什么resample如果可以完成原始操作则不允许操作。

4

2 回答 2

1

好吧,追踪表明:

df.resample('5H')['Bools'].sum == Groupby.sum (in pd.core.groupby.generic.SeriesGroupBy)
df.resample('5H').sum == sum (in pandas.core.resample.DatetimeIndexResampler)

groupby.pygroupby_function中的跟踪表明它相当于 where which 输出:r.agg(lambda x: np.sum(x, axis=r.axis))r = df.resample('5H')

                     Bools  Nums  Nums2
2020-01-01 05:00:00      2    10     10
2020-01-01 10:00:00      2    35     35

好吧,实际上,它应该是r = df.resample('5H')['Bool'](仅适用于上述情况)

并跟踪resample.py_downsample中的函数表明它相当于: 输出:df.groupby(r.grouper, axis=r.axis).agg(np.sum)

                     Nums  Nums2
2020-01-01 05:00:00    10     10
2020-01-01 10:00:00    35     35
于 2020-07-14T22:07:28.790 回答
0

df.resample('5H').sum()不适用于Bools列,因为该列具有混合数据类型,object在熊猫中。当调用orsum()时,输入的列将被忽略。resamplegroupbyobject

于 2020-07-14T21:19:23.823 回答