我有一个系统日志文件,我希望在每个事件之后计算后续事件的编号。事件列在文件中,采用长格式,其中每个事件都记录为带有时间戳的行。因此,为了计算后续事件,我必须在每个用户的每一行之后计算这些事件。
我的数据框看起来像这样(所以在这个例子中,事件将是 new ,后续要计算的事件将是分析,希望你得到要点):
created_at_date id type username
0 2017-11-13 09:17:59 1 new user1
1 2017-11-13 09:18:00 1 analysis user1
2 2017-11-13 09:18:20 1 feedback user1
3 2017-11-13 09:26:58 NaN id_new user2
所需的输出是一个矩阵,计算每个事件后的后续事件。
Event
login id_new new analysis feedback check edit
subsequent event
login 0 0 1 0 0 2 0
id_new 0 0 1 0 0 0 0
new 0 0 0 3 0 0 0
analysis 0 0 1 1 3 0 1
feedback 1 0 1 0 0 2 0
check 0 0 0 0 0 0 0
edit 0 0 0 0 0 0 0
因此,我首先创建了一个空矩阵:
a = np.zeros(shape=(7,7))
names=['new', 'analysis', 'feedback','id_new','login', 'check','edit']
df_empty = pd.DataFrame(a, index=names, columns=names)
然后使用从here改编的解决方案填充矩阵,但是,只是在行上迭代我得到一个错误,说明 ValueError:无法用空键标记索引
from itertools import tee, islice, chain, izip
def previous_and_next(some_iterable):
items, nexts = tee(some_iterable, 2)
nexts = chain(islice(nexts, 1, None), [None])
return izip(items, nexts)
for item, nxt in previous_and_next(df['event']):
df_empty.loc[item, nxt]= df_empty.loc[item, nxt] +1
df_empty
有什么想法来自哪里?
可重现的例子:
def data():
data = {'created_at_date': pd.Series(['2017-11-13 09:17:59', '2017-11-13 09:18:00', '2017-11-13 09:18:20',
'2017-11-13 09:26:58', '2017-11-13 09:28:23', '2017-11-13 09:28:24',
'2017-11-13 09:40:16', '2017-11-13 09:45:37', '2017-11-13 09:46:03',
'2017-11-13 09:46:38', '2017-11-13 09:46:39', '2017-11-13 09:46:48',
'2017-11-13 09:58:19', '2017-11-13 10:04:44', '2017-11-13 10:04:56',
'2018-04-13 10:02:36', '2018-04-13 10:02:37', '2018-04-13 10:02:41',
'2018-04-13 10:54:22', '2017-11-17 11:15:03', '2017-11-17 11:15:40',
'2018-04-13 13:38:33']),
'username': pd.Series(['user1', 'user1', 'user1',
'user2', 'user2', 'user2',
'None', 'None', 'user3',
'user3', 'user3', 'user3',
'None', 'user3', 'user3',
'user4', 'user4', 'user4',
'None', 'user1','user1', 'None']),
'id': pd.Series([1, 1, 1,
'NaN', 2, 2,
'NaN', 'NaN', 'NaN',
3, 3, 3,
'NaN', 'NaN', 'NaN',
4, 4, 'NaN',
'NaN', 5, 5,'NaN']),
'event': pd.Series(['new', 'analysis', 'feedback',
'id_new', 'new', 'analysis',
'login', 'login', 'new',
'analysis', 'feedback', 'login',
'check', 'new', 'new',
'analysis','edit', 'login',
'check', 'analysis','feedback',
'login'])}
df = pd.DataFrame(data)
df['created_at_date'] = pd.to_datetime(df['created_at_date'])
return df
df=data()
附加:如何迭代分组数据?
编辑:@ coldspeed的回复提供了另一种选择,但没有解释我用其他方法收到的错误。所以欢迎任何其他建议!