Python:计算行上的后续事件 - 'ValueError:无法使用null键标记索引'

时间:2018-05-12 19:08:01

标签: python pandas numpy itertools

我有一个系统日志文件,我希望在每个事件之后计算后续事件的编号。事件列在文件中,采用长格式,其中每个事件都记录为带有时间戳的行。因此,为了计算后续事件,我必须在每个用户的每一行之后计算这些事件。

我的数据框看起来像这样(所以在这个例子中,事件将是 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的回复提供了另一种选择,但没有解释我用其他方法收到的错误。所以欢迎任何其他建议!

0 个答案:

没有答案