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

时间:2018-11-05 04:40:56

标签: python pandas dataframe time-series

我是数据帧的新手,正在努力寻找如何实现以下目标的方法:

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

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%

我可以完成一些基本工作,例如,每天重新采样“来源”的数量,但并没有将其细分为类别。

有人可以帮我指出正确的方向吗?非常感谢。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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