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'对日期敏感,而不仅仅是时间
答案 0 :(得分:2)
问题是,apply
非常昂贵。
一种选择是通过cython或使用numba来优化代码。
This可能会有所帮助。
另一种选择如下:
df['time_ids'].map(str) + df['col1']
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')