基于阈值过滤pandas Dataframe 并在其后包括行

vbopmzt1  于 2023-04-04  发布在  其他
关注(0)|答案(2)|浏览(124)

我有一个包含几列的 Dataframe -为了简单起见,列A是一列严格递增的整数。

A    B    ...
103
222
383
432
799
1089
...

我想根据列A的阈值来过滤 Dataframe ,例如750。我可以执行类似df[df['A'] < 750]的操作来实现这一点。这会导致:

A    B    ...
103
222
383
432
...

但是,我也想在这个阈值之后直接包含这个值-例如,结果 Dataframe 也应该包含799行。

A    B    ...
103
222
383
432
799
...

一个笨拙的方法是将pd.concat这两个 Dataframe df[df['A'] < 750]df[df['A'] >= 750].iloc[0]放在一起-它本质上是原始过滤器加上750后面的单行,即799,因此是iloc[0]。是否有某种内置方法可以实现此结果,而无需手动concat?

oxiaedzo

oxiaedzo1#

您可以尝试使用idxmax查找第一个真值,其中df['A']大于750。
请注意,loc将创建原始帧的切片,因此,如果要在切片上执行其他操作,可能需要创建.copy()

df.loc[:df['A'].gt(750).idxmax()]

     A
0  103
1  222
2  383
3  432
4  799

或者,如果你想使用小于,使用idxmin,它将找到第一个false值的索引为False == 0

df.loc[:df['A'].lt(750).idxmin()]
xghobddn

xghobddn2#

你可以使用Series.searchsorted,假设 Dataframe 是按A值排序的。这应该非常快。
默认情况下,searchsorted的side是left,因为你首先想过滤〈750,然后包括下一个更高的元素到750,那么side=left应该是好的。

df.loc[:df['A'].searchsorted(750)]

输出(具有组成的“B”值):

A     B
0   103     1
1   222     2
2   383     3
3   432     4
4   799     5

相关问题