【问题标题】:How to count the number of the same instances in a column of a data frame in a rolling window如何计算滚动窗口中数据框列中相同实例的数量
【发布时间】:2018-02-20 04:00:32
【问题描述】:

我正在尝试在每个滑动窗口内为该数据计算相同 ID 的数量:

                           ID  
DATE            
2017-05-17 15:49:51         s_2   
2017-05-17 15:49:52         s_5   
2017-05-17 15:49:55         s_2   
2017-05-17 15:49:56         s_3   
2017-05-17 15:49:58         s_5
2017-05-17 15:49:59         s_5

我正在尝试计算大小为 3 的滚动窗口内相互重叠的相同 ID 的数量。答案应该是这样的:

DATE                    ID      s_2_count    s_3_count   s_5_count       
2017-05-17 15:49:51     s_2         2            0         1 
2017-05-17 15:49:52     s_5         1            1         1   
2017-05-17 15:49:55     s_2         1            1         1   
2017-05-17 15:49:56     s_3         0            1         2   
2017-05-17 15:49:58     s_5         NaN          NaN       NaN
2017-05-17 15:49:59     s_5         NaN          NaN       NaN

【问题讨论】:

    标签: python pandas numpy machine-learning data-mining


    【解决方案1】:

    使用str.get_dummiesrollingsumshiftadd_prefix

    df.ID.str.get_dummies().rolling(3).sum().shift(-2).add_suffix('_count')
    

    输出:

                         s_2_count  s_3_count  s_5_count
    DATE                                                
    2017-05-17 15:49:51        2.0        0.0        1.0
    2017-05-17 15:49:52        1.0        1.0        1.0
    2017-05-17 15:49:55        1.0        1.0        1.0
    2017-05-17 15:49:56        0.0        1.0        2.0
    2017-05-17 15:49:58        NaN        NaN        NaN
    2017-05-17 15:49:59        NaN        NaN        NaN
    

    让我们将它分配回数据框:

    df.assign(**df.ID.str.get_dummies().rolling(3).sum().shift(-2).add_suffix('_count'))
    

    或使用连接

    df.join(df.ID.str.get_dummies().rolling(3).sum().shift(-2).add_suffix('_count'))
    

    输出:

                          ID  s_2_count  s_3_count  s_5_count
    DATE                                                     
    2017-05-17 15:49:51  s_2        2.0        0.0        1.0
    2017-05-17 15:49:52  s_5        1.0        1.0        1.0
    2017-05-17 15:49:55  s_2        1.0        1.0        1.0
    2017-05-17 15:49:56  s_3        0.0        1.0        2.0
    2017-05-17 15:49:58  s_5        NaN        NaN        NaN
    2017-05-17 15:49:59  s_5        NaN        NaN        NaN
    

    使用 pd.crosstab 的选项 2

    df.assign(**pd.crosstab(df.index,df.ID).rolling(3).sum().shift(-2))
    

    或使用连接

    df.join(pd.crosstab(df.index,df.ID).rolling(3).sum().shift(-2))
    

    【讨论】:

    • @Ali ...如果您想在列中获取所有信息,可以 reset_index 。
    • 非常感谢!这是一个非常聪明的方法
    • 我可以再问一个问题,**df.ID**pd.crosstab,它们是指针吗?你有什么我可以读到的关于使用**的资料吗?
    • @Ali 我不认为数据框的 ** 字典解包已记录在案,因此我使用 join 选项更新了此解决方案。
    • 非常感谢!我现在理解代码,但如果可以的话,你能简要解释一下** 符号吗
    猜你喜欢
    • 2020-06-13
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多