Python 熊猫中的布尔值重采样

Python 熊猫中的布尔值重采样,python,pandas,boolean,pandas-resample,Python,Pandas,Boolean,Pandas Resample,我遇到了一个属性,我发现在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],

我遇到了一个属性,我发现在
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
“Bools”列被删除。我对发生这种情况的印象是b/c列的
dtype
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
而且,如果唯一的列是布尔值,您仍然可以重新采样(尽管该列仍然是
对象
):


是什么让后两个例子起作用?我可以看出它们可能更明确一些(“请,我真的想对这个列重新采样!”),但我不明白为什么原始的
重新采样
不允许这个操作,如果可以的话。

df.resample('5H').sum()
不适用于
Bools
列,因为该列的数据类型是混合的,这是熊猫中的
对象
。在
resample
groupby
上调用
sum()
时,
object
类型列将被忽略。

跟踪显示:

df.resample('5H')['Bools'].sum == Groupby.sum (in pd.core.groupby.generic.SeriesGroupBy)
在中跟踪
groupby_函数
r.agg(λx:np.sum(x,axis=r.axis))
其中
r=df.重采样('5H')
输出:

                     Bools  Nums  Nums2
2020-01-01 05:00:00      2    10     10
2020-01-01 10:00:00      2    35     35
                     Nums  Nums2
2020-01-01 05:00:00    10     10
2020-01-01 10:00:00    35     35
实际上,它应该是
r=df.resample('5H')['Bool']
(仅适用于上述情况)

在中跟踪
\u downsample
函数表明它相当于:
df.groupby(r.grouper,axis=r.axis).agg(np.sum)
它输出:

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

是的,但是我更想知道为什么你可以做
df.resample('5H')['Bools'].sum()
或者
df.drop(['Nums'],axis=1)。resample('5H').sum()
。数据仍然是类型
object
在这些情况下,否?可能在某个地方有一个标志,用于检查所有列是否都是
object
类型。在这种情况下,
sum
强制作用于所有列,这也适用于
list
类型。因此,
df.astype('object').resample('5H').sum()
也会起作用。我不知道这会起作用,并且会解释为什么
drop
版本会起作用。谢谢分享这个有趣的!我想这些确实可以归结为稍微不同的事情,感谢跟踪这些细节是的,我担心这种区别仅仅是重复的(感觉还是有点像!)-但是,
lambda
对每个列单独进行了添加,而另一个版本没有(
.agg(np.sum,axis=0)
这样做)