One boy
One boy

Reputation: 214

Drop rows before the last True False

I have a df like this and I want to drop everything before the last row 'isBuyer' == True and prev_isBuyer == False

The row 4 is the last row that contain isBuyer == True and prev_isBuyer == False, I want to drop all the rows before that. You can see my expected result. Not sure if i'm clear enough.

Some information, the last row of my df 'isBuyer' will always be False.

      symbol  isBuyer prev_isBuyer
0   DOCKUSDT     True          NaN
1   DOCKUSDT    False         True
2   DOCKUSDT     True        False
3   DOCKUSDT    False         True
4   DOCKUSDT     True        False
5   DOCKUSDT     True         True
6   DOCKUSDT     True         True
7   DOCKUSDT    False         True
8   DOCKUSDT    False        False
9   DOCKUSDT    False        False
10  DOCKUSDT    False        False
11  DOCKUSDT    False        False
12  DOCKUSDT    False        False
13  DOCKUSDT    False        False
14  DOCKUSDT    False        False
15  DOCKUSDT    False        False

expected result:

      symbol  isBuyer prev_isBuyer
4   DOCKUSDT     True        False
5   DOCKUSDT     True         True
6   DOCKUSDT     True         True
7   DOCKUSDT    False         True
8   DOCKUSDT    False        False
9   DOCKUSDT    False        False
10  DOCKUSDT    False        False
11  DOCKUSDT    False        False
12  DOCKUSDT    False        False
13  DOCKUSDT    False        False
14  DOCKUSDT    False        False
15  DOCKUSDT    False        False

Upvotes: 1

Views: 55

Answers (2)

Danil Martyniuk
Danil Martyniuk

Reputation: 11

Simple solution.

# considering df is your dataframe containing columns listed
# find elements that match your condition
separator_elements = df[(df['prev_isBuyer'] == False) & (df['isByuer'] == True)]
# get index of first one
index = separator_elements.index[0]
# splitting the dataframe by index
df_filtered = df.iloc[index:, :] 

Upvotes: 0

mozway
mozway

Reputation: 261860

You can use boolean indexing with a custom reversed cummin:

df[df.loc[::-1, 'prev_isBuyer'].diff().shift().ne(-1).cummin()]

How it works:

  • reverse Series
  • get diff and shift to identify the last False/True
  • cummin to get rid of all previous True (as the Series is inverted)

output:

      symbol  isBuyer prev_isBuyer
4   DOCKUSDT     True        False
5   DOCKUSDT     True         True
6   DOCKUSDT     True         True
7   DOCKUSDT    False         True
8   DOCKUSDT    False        False
9   DOCKUSDT    False        False
10  DOCKUSDT    False        False
11  DOCKUSDT    False        False
12  DOCKUSDT    False        False
13  DOCKUSDT    False        False
14  DOCKUSDT    False        False
15  DOCKUSDT    False        False

Upvotes: 1

Related Questions