每个期间的价值计数,将先前的值考虑在内

时间:2017-04-24 03:34:15

标签: pandas

我们有一个记录列表,指示指定项目的状态更改。因此,每条记录都表明该项目,其活动状态(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

我们如何在计算期间计数时包含项目的最新值?

2 个答案:

答案 0 :(得分:1)

您可以使用:

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)

让我们使用groupbyresample

的副本

准备数据:

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