如何使用 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
假设我有一个如下格式的 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