【问题标题】:Value counts per period, taking prior values into account每个时期的价值计数,考虑到先前的价值
【发布时间】:2017-04-24 14:05:29
【问题描述】:

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

我想计算一个聚合来指示每个时间段存在的活动项目的数量。这个数字应该包括那些状态没有改变的项目(在这个例子中,A 没有提到 2 月或 3 月,但应该在两者中都计算在内)。所以在上面的例子中,这将是一个正确的结果:

month   active_count
--------------------
2016-01 1
2016-02 2
2016-03 1
2016-04 0

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

【问题讨论】:

    标签: pandas


    【解决方案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
    

    【讨论】:

    • 这似乎无法正常工作。如果我将样本数据更改为:data = [{"item": "A", "active": 1, "date": "2016-01-01"}, {"item": "B", "active": 1, "date": "2016-02-01"}, {"item": "C", "active": 1, "date": "2016-02-10"}, {"item": "B", "active": 0, "date": "2016-03-01"}, {"item": "A", "active": 0, "date": "2016-04-01"}],那么2016-22016-03active_count 应该分别为32。然而,上面的代码会在这些期间产生 31
    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 2021-07-27
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2015-04-09
    • 1970-01-01
    相关资源
    最近更新 更多