如何从时间序列重采样中获取列中的类别计数

Posted

技术标签:

【中文标题】如何从时间序列重采样中获取列中的类别计数【英文标题】:How to get count of categories within column from time series resample 【发布时间】:2019-04-08 11:04:42 【问题描述】:

我是数据框架的新手,正在努力弄清楚如何完成以下任务:

我已经有一个像这样的时间序列的数据框:

timestamp             source                        
2017-06-18 10:43:54    two
2017-06-20 03:38:23    three
2017-06-18 07:37:02    one
2017-06-07 16:49:51    two
2017-06-15 22:36:10    two
2017-06-07 16:49:51    two
2017-06-18 22:36:10    two

我正在尝试 1)每天重新采样,2)获得当天每个类别的百分比。像这样:

timestamp      One    Two  Three                    
2017-06-18     33%    66%    0%
2017-06-20     0%     0%    100%
2017-06-07     0%    100%    0%
2017-06-15     0%    100%    0%

我可以完成一些基本的事情,例如每天重新采样的“来源”计数,但它不会将其分解为类别。

谁能帮我指出正确的方向?非常感谢。

【问题讨论】:

我建议你展示你已经完成的代码。 【参考方案1】:

groupby + value_counts + unstack

(df.groupby(df.timestamp.dt.date).source.value_counts(normalize=True)*100).unstack().fillna(0)

source            one  three         two
timestamp                               
2017-06-07   0.000000    0.0  100.000000
2017-06-15   0.000000    0.0  100.000000
2017-06-18  33.333333    0.0   66.666667
2017-06-20   0.000000  100.0    0.000000

pivot_table

df2 = df.pivot_table(index=df.timestamp.dt.date, columns='source', aggfunc='size')
df2 = df2.divide(df2.sum(1), axis=0).fillna(0)*100

pd.crosstab

pd.crosstab(df.timestamp.dt.date, df.source, normalize='index')*100

【讨论】:

谢谢,这有助于清除我做错的一些事情。此外,我主要尝试使用“resample”。 @Frankie 因为您似乎只希望输出中出现在原始表中的天数,我认为groupby 更合适。重新采样会给你中间的空天,而且不确定它是否适用于这种类型的计算。 或者:df.pivot_table(index=df.timestamp.dt.date, columns='source', aggfunc='size', fill_value=0).apply(lambda x: 100*x/x.sum(), axis=1)【参考方案2】:

to_period + value_counts 可以提供帮助!

date    winlose
0   2020-01-17  -1
1   2020-01-28  0
2   2020-02-06  0
3   2020-02-20  1
4   2020-02-21  1

df.to_period('M').groupby('date')['winlose'].value_counts().unstack().fillna(0) 应该是另一种选择

winlose -1  0   1
date            
2020-01 1.0 1.0 0.0
2020-02 0.0 2.0 2.0
2020-03 0.0 0.0 1.0
2020-04 1.0 1.0 1.0
2020-05 1.0 3.0 0.0
2020-06 0.0 2.0 1.0
2020-07 1.0 3.0 0.0
2020-08 1.0 1.0 1.0
2020-09 1.0 3.0 0.0
2020-10 1.0 1.0 0.0
2020-11 0.0 1.0 0.0
2020-12 2.0 3.0 1.0

【讨论】:

以上是关于如何从时间序列重采样中获取列中的类别计数的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询以获取列中每个元素的计数

python pandas重采样计数和总和

时间序列重采样错误 - 熊猫列中没有日期索引

从 Pandas 的重采样中获取索引

MySQL - 如何根据另一列中的唯一值转置一列中的单元格?

从数据框中的列中采样唯一行而不进行替换