pandas:计算时间移动​​窗口内的行数

时间:2018-03-18 10:50:17

标签: python-3.x pandas dataframe count

import pandas as pd
d = [{'col1' : ' B', 'col2' : '2015-3-06 01:37:57'},
       {'col1' : ' A', 'col2' : '2015-3-06 01:39:57'},
       {'col1' : ' A', 'col2' : '2015-3-06 01:45:28'},
       {'col1' : ' B', 'col2' : '2015-3-06 02:31:44'},
       {'col1' : ' B', 'col2' : '2015-3-06 03:55:45'},
       {'col1' : ' B', 'col2' : '2015-3-06 04:01:40'}]
df = pd.DataFrame(d)
df['col2'] = pd.to_datetime(df['col2'])

对于每行我想要计算具有相同行数 'col1'的值和此行(包括)之前的过去10分钟窗口内的时间。我对实施感兴趣,快速

此源在大数据集上非常

dt = pd.Timedelta(10, unit='m')
def count1(row):
    id1 = row['col1']
    start_time = row['col2'] - dt
    end_time = row['col2']
    mask = (df['col1'] == id1) & ((df['col2'] >= start_time) & (df['col2'] <= end_time))
    return df.loc[mask].shape[0]

df['count1'] = df.apply(count1, axis=1)

df.head(6)

    col1    col2    count1
0   B   2015-03-06 01:37:57     1
1   A   2015-03-06 01:39:57     1
2   A   2015-03-06 01:45:28     2
3   B   2015-03-06 02:31:44     1
4   B   2015-03-06 03:55:45     1
5   B   2015-03-06 04:01:40     2

注意:列'col2'对日期敏感,而不仅仅是时间

2 个答案:

答案 0 :(得分:2)

问题是,apply非常昂贵。 一种选择是通过cython或使用numba来优化代码。

This可能会有所帮助。

另一种选择如下:

  1. 使用col2
  2. 创建时间戳列
  3. 创建一个包含ID的列,该列按10分钟标准对时间戳进行分组
  4. 使用之前创建的ID和col1创建一个组合列,如df['time_ids'].map(str) + df['col1']
  5. 使用groupby确定相等行数。类似于:df.groupby(df['combined_ids']).size()

答案 1 :(得分:0)

尝试使用

df.col2=pd.to_datetime(df.col2)
df.groupby([pd.Grouper(key='col2',freq='H'),df.col1]).size().reset_index(name='count')