【发布时间】:2021-05-01 01:20:25
【问题描述】:
我有一个包含两列的数据框。一列是 ID,一列是时间戳,以微秒为单位。
我想识别在给定时间段内出现超过 n 次的每个 id。假设我想识别在 5 分钟内出现至少 100 次的每个 id。 我的代码可以工作,但速度很慢,而且看起来相当复杂而不是熊猫:
def getInfoDict(ip, start, end, num):
return {
'ip': ip,
'start': start,
'end': end,
'num': num
}
dtypes = {'ip.src': 'str','frame.time_epoch': 'str'}
df = pd.read_csv(path, header=None, usecols=[0,9], names=['ip.src','frame.time_epoch'], dtype=dtypes)
df['frame.time_epoch'] = pd.to_datetime(df['frame.time_epoch'],unit='s')
result = []
timeout = pd.Timedelta(value=300,unit='s')
for ip in df['ip.src'].unique():
subset = df[df['ip.src'] == ip]
if len(subset) > 49:
start = 0
counter = 0
for index, row in subset.iterrows():
if start == 0 or pd.Timedelta(row['frame.time_epoch'] - start).microseconds > 300000000:
start = row['frame.time_epoch']
counter = 1
continue
counter = counter + 1
end = row['frame.time_epoch']
if counter > 99:
result.append(getInfoDict(ip, start, end, counter))
df = pd.DataFrame(result)
df.to_csv("result.csv", index=False)
有什么更好的方法来做到这一点?我一直在研究熊猫系列,但我不知道该怎么做。
【问题讨论】:
-
你可以通过
df['tag'] = df['frame.time_epoch'].astype(float)//300在frame.time_epoch上创建一个5分钟的组,然后df.groupby(['tag', 'ip.src']).size()找到每5分钟的范围,哪个ip出现的次数超过了给定的次数。
标签: python pandas performance time