如何在一个滚动的风中计算数据帧的一列中相同实例的数量

2022-09-28 21:13:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为这些数据计算每个滑动窗口中相同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

Tags: 数据答案id数量datecountnan数目
1条回答
网友
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'))

或者使用join

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

选项2使用pd.交叉表你知道吗

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

或者使用join

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