【发布时间】:2014-08-30 06:26:45
【问题描述】:
这是一个示例 DataFrame,我将使用它来更好地说明我的问题:
import pandas as pd
df = pd.DataFrame(pd.np.random.rand(30, 3), columns=tuple('ABC'))
df['event'] = pd.np.nan
df.loc[10, 'event'] = 'ping'
df.loc[20, 'event'] = 'ping'
df.loc[19, 'event'] = 'pong'
我需要创建以 ping 的每次出现为中心的 n 行窗口。
换句话说,让i 成为event 列中包含ping 的行的索引。对于每个i,我想选择df.ix[i-n:i+n]。
因此,对于n=3,我希望得到以下结果:
A B C event
7 0.8295863 0.2162861 0.4856461 NaN
8 0.156646 0.4730667 0.9968878 NaN
9 0.6709413 0.4796197 0.8747416 NaN
10 0.09942329 0.154008 0.5761598 ping
11 0.7168143 0.678207 0.7281105 NaN
12 0.8915475 0.8013187 0.9049722 NaN
13 0.9545411 0.4844835 0.1645746 NaN
17 0.9909208 0.1091025 0.6582635 NaN
18 0.2536326 0.4324749 0.8001643 NaN
19 0.4734659 0.5582809 0.1221296 pong
20 0.7230407 0.6695843 0.3902591 ping
21 0.3624909 0.2685049 0.5484445 NaN
22 0.05626284 0.6113877 0.9131929 NaN
23 0.8312294 0.5694373 0.4325798 NaN
[14 rows x 4 columns]
一些注意事项:
- 我正在寻找非迭代解决方案。
- 请注意,有一个
pong值,我们不希望将窗口居中。但是,它是在以第二个ping为中心的结果中捕获的。
如何做到这一点?
【问题讨论】:
-
1.对数据框进行排序; 2.获取ping出现的行数; 3. 围绕行获取行。这有意义吗?
-
@RJT,您能详细说明一下吗?我不明白这与我的问题有什么关系。
-
抱歉,我太快按 Enter 键了。我的评论旨在询问这些步骤对您是否有意义,并澄清您的问题究竟出在哪里。
-
刚刚发布了一个答案让我知道窗口和结果范围是否是您想要的,如果您想包含/排除值,可以轻松修改
-
@RJT,没问题!我很抱歉,但我仍然没有看到光明。为什么要排序才能得到
ping的行号?我不能只做df[df.event == 'ping'].index吗?另外,我应该按什么排序?您介意提交一个带有工作示例的正确答案吗?
标签: python pandas indexing vectorization