如何在最后一个值出现后删除所有行?

4

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

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个回答

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()]

Option 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]]

3

mask and bfill

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

cumsum and idxmax

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

cumsum and max

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接