如何选择特定列中与给定值保持一定距离的所有数据帧行?

2024-03-29 06:10:32 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一个示例数据帧,我将使用它来更好地说明我的问题:

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,我期望得到以下结果:

^{pr2}$

一些注意事项:

  1. 我在寻找一个非迭代的解决方案。在
  2. 请注意,有一个pong值,我们不想将窗口置于中心位置。但是,它是在第二个ping中心的结果中捕获的。在

如何做到这一点?在


Tags: 数据importevent示例dataframepandasdfas
3条回答

也许:

>>> ts, n = df['event'] == 'ping', 3
>>> idx = ts.shift(n).fillna(False)  # +n rows
>>> for j in range(-n, n):  # -n to n-1 rows
...     idx |= ts.shift(j).fillna(False)
... 
>>> df[idx]

一种方法是使用嵌套np.哪里条款。这不是最漂亮的代码,但它确实起了作用。在

ping = pd.Series(np.where(df.event == 'ping', True,
                          np.where(df.event.shift(1) == 'ping', True,
                                   np.where(df.event.shift(-1) == 'ping', True, False))), index=df.index)

df[ping]

有人能帮我把i=1的案子转到普通案件吗?在

编辑:实际上,它们不需要嵌套。这样做可以:

^{pr2}$
In [17]: n = 3

选择所需范围的索引器,例如目标索引+-3(取决于帧大小的最大/最小值)。把它们串联起来,消除重复。在

^{pr2}$

选择它们。在

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()(在选择获取实际的行索引位置,而不是值之前)。在

注意这里的错误是'event'列的设置将所有内容转换为object,请参见here。您可以使用df.convert_objects()来缓解。在

相关问题 更多 >