如何删除最后一次出现值后的所有行?

时间:2019-06-13 15:37:36

标签: python pandas

我有一个带有字符串列的数据框,我想删除最后一次出现名称后的所有行。

first_name
Andy
Josh
Mark
Tim
Alex
Andy
Josh
Mark
Tim
Alex
Andy
Josh
Mark

我想在Alex上次出现后删除行,所以请与Andy,Josh和Mark删除行。

我认为我会在第一次出现之前使用df=df[(df.first_name== 'Alex').idxmax():]删除,但不知道如何删除最后一行。

谢谢!

2 个答案:

答案 0 :(得分:4)

argmax

df.iloc[:len(df) - (df.first_name.to_numpy() == 'Alex')[::-1].argmax()]

  first_name
0       Andy
1       Josh
2       Mark
3        Tim
4       Alex
5       Andy
6       Josh
7       Mark
8        Tim
9       Alex

last_valid_index

df.loc[:df.where(df == 'Alex').last_valid_index()]

选项3

df.loc[:df.first_name.eq('Alex')[::-1].idxmax()]

选项4

df.iloc[:np.flatnonzero(df.first_name.eq('Alex')).max() + 1]

选项5

这很愚蠢!

df[np.logical_or.accumulate(df.first_name.eq('Alex')[::-1])[::-1]]

答案 1 :(得分:2)

maskbfill

df[df['first_name'].mask(df['first_name'] != 'Alex').bfill().notna()]

  first_name
0       Andy
1       Josh
2       Mark
3        Tim
4       Alex
5       Andy
6       Josh
7       Mark
8        Tim
9       Alex

cumsumidxmax

df.loc[:(df['first_name'] == 'Alex').cumsum().idxmax()]

  first_name
0       Andy
1       Josh
2       Mark
3        Tim
4       Alex
5       Andy
6       Josh
7       Mark
8        Tim
9       Alex

cumsummax

u = (df['first_name'] == 'Alex').shift().cumsum()
df[u < u.max()]

  first_name
1       Josh
2       Mark
3        Tim
4       Alex
5       Andy
6       Josh
7       Mark
8        Tim
9       Alex