python - 如何选择特定列中给定值一定距离内的所有 DataFrame 行?

标签 python pandas indexing vectorization

这是一个 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 行窗口。

换句话说,令ievent 列中包含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]

一些注意事项:

  1. 我正在寻找非迭代解决方案。
  2. 请注意,有一个 pong 值,我们不想让窗口居中。然而,它是在以第二个 ping 为中心的结果中捕获的。

如何实现?

最佳答案

In [17]: n = 3

选择一个符合您需要范围的索引器,例如目标索引 +- 3(取决于框架大小的最大值/最小值)。将它们全部连接起来,并消除重复项。

In [18]: indexers = np.unique(np.concatenate([ np.arange(max(i-n,0),min(i+n,len(df))) for i in df[df.event=='ping'].index ]))

In [19]: indexers
Out[19]: array([ 7,  8,  9, 10, 11, 12, 17, 18, 19, 20, 21, 22])

选择它们。

In [20]: df.iloc[indexers]
Out[20]: 
             A           B          C event
7   0.03348742  0.05735324  0.1220022   NaN
8    0.9567363   0.6539097  0.8409577   NaN
9    0.3115902   0.4955503  0.1749197   NaN
10   0.6883777   0.6185107  0.7933182  ping
11   0.5185129   0.6533616  0.1569159   NaN
12   0.1196976   0.9638604  0.7318006   NaN
17  0.02897615   0.1224485  0.5706852   NaN
18  0.02409971   0.4715463  0.4587161   NaN
19   0.9070592   0.3371241  0.9543977  pong
20   0.8533369   0.7549413  0.5334882  ping
21   0.9546738   0.8203931  0.8543028   NaN
22  0.05691086   0.2402766  0.3922318   NaN

请注意,您可能需要执行 df.reset_index()(在您选择获取实际行索引位置而不是值之前)。

请注意,这里是一个错误,因为“事件”列的设置会将所有内容都转换为对象,请参阅 here .您可以使用 df.convert_objects() 来缓解。

关于python - 如何选择特定列中给定值一定距离内的所有 DataFrame 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24650117/

相关文章:

python - 为什么我的 Flask 网站没有运行 CSS 文件?

python - reshape /透视具有重复键值的键值对数据文件

Python Panda.read_csv 四舍五入得到导入错误?

python - 从 panda DataFrame 创建 pd.Series 列表

elasticsearch - 使用NEST V5.4重新索引-ElasticSearch

python - 用一半的时间替换 1 个空格或什么都不替换

c++ - scons:对象、源代码、可执行文件,都在单独的目录中

python - 使用 idxmax 求最大值

python - 如何同时获取元组的第一个和最后一个元素

mysql - 多列索引与每个列的索引?数据库