Pandas获取map函数中元素的索引

时间:2015-03-03 10:06:31

标签: python pandas

我正在使用pandas来分析不同节点的现有ssh会话,因为我已经解析了ssh守护程序日志,并且我有一个包含以下列的DataFrame:

  • 节点:建立连接的节点的名称
  • 会话:会话的ID
  • 开始:指示连接何时开始的时间戳
  • 结束:指示连接何时结束的时间戳

以下是数据的一部分:

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)

问题是我还需要考虑'Node'列值,但我不知道如何获取它。

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

2 个答案:

答案 0 :(得分: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 :(得分: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),它只是根据行值计算数据框中符合任何条件的行数。