如何从时间序列重采样中获取列中的类别计数
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
【讨论】:
以上是关于如何从时间序列重采样中获取列中的类别计数的主要内容,如果未能解决你的问题,请参考以下文章