我们有一个记录列表,指示指定项目的状态更改。因此,每条记录都表明该项目,其活动状态(0或1)以及该状态更改的日期。
小例子:
import pandas as pd
data = [
{"item": "A", "active": 1, "date": "2016-01-01"},
{"item": "B", "active": 1, "date": "2016-02-01"},
{"item": "C", "active": 0, "date": "2016-02-10"},
{"item": "B", "active": 0, "date": "2016-03-01"},
{"item": "A", "active": 0, "date": "2016-04-01"},
]
df = pd.DataFrame(data)
# active date item
# 0 1 2016-01-01 A
# 1 1 2016-02-01 B
# 2 0 2016-02-10 C
# 3 0 2016-03-01 B
# 4 0 2016-04-01 A
我想计算一个聚合来指示每个时间段内存在的活动项目数。该数字应包括那些状态未发生变化的项目(例如,2月或3月未提及A,但两者均应计入)。所以在上面的例子中,这将是一个正确的结果:
month active_count
--------------------
2016-01 1
2016-02 2
2016-03 1
2016-04 0
我们如何在计算期间计数时包含项目的最新值?
答案 0 :(得分:1)
您可以使用:
date
期month
to_datetime
+ to_period
set_index
+ groupby
+ resample
+上传ffill
groupby
Datetimeindex
级MultiIndex
+ sum
reset_index
df['date'] = pd.to_datetime(df['date']).dt.to_period('M')
df1 = df.set_index('date')
.groupby('item')
.resample('M')
.ffill()
.groupby(level=1)['active']
.sum()
.reset_index(name='active_count')
print (df1)
date active_count
0 2016-01 1
1 2016-02 2
2 2016-03 1
3 2016-04 0
答案 1 :(得分:0)
让我们使用groupby
和resample
准备数据:
df = df.set_index('date')
df.index = pd.to_datetime(df.index)
进行分组,重新取样和求和:
df_month = (df.groupby('item').apply(lambda x: x.resample('MS').sum())
.fillna(method='ffill').reset_index('item')
.groupby(level=0).sum())
努力工作已经完成,现在让我们做一些清理和重命名:
df_month['month'] = df_month.index.strftime('%Y-%m')
df_month = df_month.reset_index(drop=True).rename(columns={'active':'active_count'})
print(df_month[['month','active_count']])
输出:
month active_count
0 2016-01 1.0
1 2016-02 2.0
2 2016-03 1.0
3 2016-04 0.0