让我们有一个这样的DataFrame日志:
>>> log
state
date_time
2020-01-01 00:00:00 0
2020-01-01 00:01:00 0
2020-01-01 00:02:00 0
2020-01-01 00:03:00 1
2020-01-01 00:04:00 1
2020-01-01 00:05:00 1
其中state列可以为0或1(或者不存在)。如果用UInt8(支持
>>> log.resample(dt.timedelta(minutes=2)).mean()
state
date_time
2020-01-01 00:00:00 0.0
2020-01-01 00:02:00 0.5
2020-01-01 00:04:00 1.0
重新采样工作得很好,只有值0.5没有意义,因为它只能是0或1。出于同样的原因,使用类别作为该列的dtype是有意义的。然而,在这种情况下,重采样将无法工作,因为mean()方法仅适用于数值数据。
这是一个完美的意义-然而-我可以想象一个降采样&对分类数据的平均过程,只要组内数据保持相同,结果就是该特定值,否则结果为
categorical_average(['aple', 'aple']) -> 'aple'
categorical_average(['pear', 'pear']) -> 'pear'
categorical_average(['aple', 'pear']) -> <NA>
对于呈现的DataFramelog与类别状态列将导致:
>>> log.resample(dt.timedelta(minutes=2)).probably_some_other_method()
state
date_time
2020-01-01 00:00:00 0
2020-01-01 00:02:00 <NA>
2020-01-01 00:04:00 1
顺便说一句,我做resample.main()
是因为有许多其他的(数字)列,在那里它是完全有意义的,我只是没有在这里明确地提到它为简单。
使用自定义函数测试if-else
是否唯一:
f = lambda x: x.iat[0] if len(x) > len(set(x)) else pd.NA
a = log.resample(dt.timedelta(minutes=2)).agg({'state':f})
print (a)
state
date_time
2020-01-01 00:00:00 0
2020-01-01 00:02:00 <NA>
2020-01-01 00:04:00 1