Pandas 获取地图函数中元素的索引
Pandas get the index of an element in a map function
我正在使用 pandas 来分析现有的到不同节点的 ssh 会话,为此我已经解析了 ssh 守护进程日志并且我有一个包含以下列的 DataFrame:
- 节点:建立连接的节点名称
- Session:会话的ID
- 开始:指示连接何时开始的时间戳
- Finish:连接结束时的时间戳
部分数据如下:
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 中的节点,但我没有找到任何方法来检索传递给地图的元素的索引。
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 以获得灵感。
只是关于另一种方法的建议:我不确定标准,但你应该能够轻松地适应它:
sessions['OpenSessions'] = sessions.apply(\
lambda row: len(sessions[(sessions['Start'] < row['Start']) &\
(sessions['Finish'] > row['Finish']) &\
(sessions['Node'] == row['Node'])]), axis = 1)
对于每一行(参数 axis = 1
),它只是根据行值计算数据框中符合您想要的任何条件的行数。
我正在使用 pandas 来分析现有的到不同节点的 ssh 会话,为此我已经解析了 ssh 守护进程日志并且我有一个包含以下列的 DataFrame:
- 节点:建立连接的节点名称
- Session:会话的ID
- 开始:指示连接何时开始的时间戳
- Finish:连接结束时的时间戳
部分数据如下:
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 中的节点,但我没有找到任何方法来检索传递给地图的元素的索引。
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 以获得灵感。
只是关于另一种方法的建议:我不确定标准,但你应该能够轻松地适应它:
sessions['OpenSessions'] = sessions.apply(\
lambda row: len(sessions[(sessions['Start'] < row['Start']) &\
(sessions['Finish'] > row['Finish']) &\
(sessions['Node'] == row['Node'])]), axis = 1)
对于每一行(参数 axis = 1
),它只是根据行值计算数据框中符合您想要的任何条件的行数。