删除包含特定值的行之后的 pandas DataFrame 行

Drop a pandas DataFrame row that comes after a row that contains a particular value

我正在尝试删除 'Ammend'yes 之后的所有行

df:

  Ammend
 0  no
 1  yes
 2  no
 3  no
 4  yes
 5  no

要求输出 df:

  Ammend
 0  no
 1  yes
 3  no
 4  yes

看下面代码:

df = df.drop(df[df['Amended' == 'yes']], inplace=True)

Returns 一个 KeyError: False 错误信息

我已经使用 .index.tolist().loc 等不同方法尝试了很多不同的变体 但我似乎还是想不通。

我也试过截断:

filings_df.truncate(after=filings_df.loc[filings_df['Filings'] == '10-K/A'].index[0], before = filings_df.loc[filings_df['Filings'] == '10-K/A'].index[1])

这个returns:

IndexError: index 1 is out of bounds for axis 0 with size 1

试试这个

import pandas as pd
import numpy as np

np.random.seed(525)
df = pd.DataFrame({'Other': np.random.rand(10), 'Ammend': np.random.choice(['yes', 'no'], 10)})
df
      Other Ammend
0  0.750282     no
1  0.379455     no
2  0.766467    yes
3  0.351025     no
4  0.965993     no
5  0.709159     no
6  0.838831    yes
7  0.218321     no
8  0.573360    yes
9  0.738974     no

输出:

df.drop(index=df[df['Ammend'].shift() == 'yes'].index)

      Other Ammend
0  0.750282     no
1  0.379455     no
2  0.766467    yes
4  0.965993     no
5  0.709159     no
6  0.838831    yes
8  0.573360    yes

使用 pandas.Series.neshift 技巧的一种方法:

s = df["Ammend"]
new_df = df[~s.ne(s.shift()).cumsum().duplicated(keep="first")]
print(new_df)

输出:

  Ammend
0     no
1    yes
2     no
4    yes
5     no