2015-03-03 45 views
2

我使用熊猫分析现有SSH会话到不同的节点,为我所分析的ssh守护进程日志和我有一个包含以下列的数据帧:大熊猫得到一个元素的索引中的地图功能

  • 节点:在连接建立
  • 届节点的名称:会议的ID
  • 开始:什么时候在连接开始
  • 完成时间戳:时间戳indicanting当连接结束

这里的数据的一部分:

In [375]: sessions[1:10]         
Out[375]: 
    Node Session    Start    Finish 
1 svg01 27321 2015-02-23 07:24:45 2015-02-23 07:50:57 
2 svg02 14171 2015-02-23 10:25:08 2015-02-23 14:33:24 
3 svg02 14273 2015-02-23 10:26:21 2015-02-23 14:36:19 
4 svg01 14401 2015-02-23 10:28:16 2015-02-23 14:38:04 
5 svg01 26408 2015-02-23 14:01:49 2015-02-23 18:38:25 
6 svg03 13722 2015-02-23 18:24:39 2015-02-23 20:51:59 
7 svg05 17637 2015-02-23 19:10:00 2015-02-23 19:10:20 

我想生成具有在建立一个新的连接在一个给定的节点建立的会话数量的附加列。

不考虑节点,我可以用计算这个:

count_sessions = lambda t: sessions[(sessions.Start<t) & (sessions.Finish>t)].shape[0] 
sessions['OpenSessions'] = sessions['Start'].map(count_sessions) 

的问题是,我还需要考虑到“节点”列的值,但我不知道如何得到它。

我可以使用Series中元素的索引来获取会话DataFrame中的节点,但是我没有找到任何方法来检索传递给地图的元素的索引。

+0

你能提供一个CSV吗?如果可以直接将数据解析到DataFrame中,则更容易摆弄数据... – filmor 2015-03-03 10:23:33

+0

以下是数据集:https://www.dropbox.com/s/a8q73338nz2okvy/sessions.csv – alcachi 2015-03-03 11:31:45

+0

此方法是O(n ** 2),如果'sessions'有很多行,则方法很慢。如果您使用sort&cumsum,则可以加速O(n * log(n))。 – HYRY 2015-03-03 13:13:03

回答

1
def count(df): 
    count_sessions = lambda t: df[(df.Start<t) & (df.Finish>t)].shape[0] 
    df['OpenSessions'] = df['Start'].map(count_sessions) 
    return df 

print sessions.groupby('Node').apply(count) 

输出是:

Node Session    Start    Finish OpenSessions 
0 svg01 27321 2015-02-23 07:24:45 2015-02-23 07:50:57    0 
1 svg02 14171 2015-02-23 10:25:08 2015-02-23 14:33:24    0 
2 svg02 14273 2015-02-23 10:26:21 2015-02-23 14:36:19    1 
3 svg01 14401 2015-02-23 10:28:16 2015-02-23 14:38:04    0 
4 svg01 26408 2015-02-23 14:01:49 2015-02-23 18:38:25    1 
5 svg03 13722 2015-02-23 18:24:39 2015-02-23 20:51:59    0 
6 svg05 17637 2015-02-23 19:10:00 2015-02-23 19:10:20    0 

阅读this寻找灵感。

1

刚想另一种方式的建议进行:我不知道有关的标准,但你应该能够很容易地适应这样的:

sessions['OpenSessions'] = sessions.apply(\ 
    lambda row: len(sessions[(sessions['Start'] < row['Start']) &\ 
          (sessions['Finish'] > row['Finish']) &\ 
          (sessions['Node'] == row['Node'])]), axis = 1) 

对于每一行(参数axis = 1),它只是统计数根据行值匹配您所需的任何标准的数据框中的行数。