如何使用 True 布尔值检索 pandas 行周围的数据帧行?

How to retrieve pandas dataframe rows surrounding rows with a True boolean?

假设我有一个如下格式的 df:

假设第 198 行对于 rot_mismatch 为 True,检索 True 行(简单)和上下行(未解决)的最佳方法是什么?

我有多条带有 True 布尔值的线,我想自动创建一个数据框以进行更深入的调查,始终包括 True 线及其周围的线。

谢谢!

编辑澄清:

示例输入:

id name Bool
1 Sta False
2 Danny True
3 Elle False
4 Rob False
5 Dan False
6 Holger True
7 Mat True
8 Derrick False
9 Lisa False

期望的输出:

id name Bool
1 Sta False
2 Danny True
3 Elle False
5 Dan False
6 Holger True
7 Mat True
8 Derrick False

是你想要的吗?

df_true=df.loc[df['rot_mismatch']=='True',:]
df_false=df.loc[df['rot_mismatch']=='False',:]

试试 shift:

>>> df[df["rot_mismatch"]|df["rot_mismatch"].shift()|df["rot_mismatch"].shift(-1)]
        dep_ap_sched     arr_ap_sched  rot_mismatch
120      East Carmen  South Nathaniel         False
198  South Nathaniel      East Carmen          True
289      East Carmen       Joneshaven         False

修正示例的输出:

>>> df[df["Bool"]|df["Bool"].shift()|df["Bool"].shift(-1)]
   id     name   Bool
0   1      Sta  False
1   2    Danny   True
2   3     Elle  False
4   5      Dan  False
5   6   Holger   True
6   7      Mat   True
7   8  Derrick  False

假设输入:

  col1  rot_mismatch
0    A         False
1    B          True
2    C         False
3    D         False
4    E         False
5    F         False
6    G          True
7    H          True

要获得 N 行 before/after 任何 True,您可以使用 rolling operation to compute a mask for boolean indexing:

N = 1
mask = (df['rot_mismatch']
        .rolling(2*N+1, center=True, min_periods=1)
        .max().astype(bool)
       )
df2 = df.loc[mask]

输出:

# N = 1
  col1  rot_mismatch
0    A         False
1    B          True
2    C         False
5    F         False
6    G          True
7    H          True

# N = 0
  col1  rot_mismatch
1    B          True
6    G          True
7    H          True

# N = 2
  col1  rot_mismatch
0    A         False
1    B          True
2    C         False
3    D         False
4    E         False
5    F         False
6    G          True
7    H          True