根据条件修剪数据帧的最后行

2024-04-25 01:03:40 发布

您现在位置:Python中文网/ 问答频道 /正文

假设这样的数据帧:

idx  x  y
0    a  3
1    b  2
2    c  0
3    d  2
4    e  5

如何根据条件修剪最下面的行,以便删除最后一个与条件匹配的行之后的任何行?你知道吗

例如:

with the following condition: y == 0

输出将是

idx  x  y
0    a  3
1    b  2
2    c  0

这种情况可能发生很多次,但最后一次是触发切割的情况。你知道吗


Tags: the数据with情况condition条件followingidx
3条回答

设置数据帧:

data = [
    [ 'a',  3],
[ 'b' , 2],
[  'c' , 0],
[  'd',  2],
[ 'e' , 5]
]
df = pd.DataFrame(data, columns=['x',  'y']).reset_index().rename(columns={'index':'idx'}).sort_values('idx')

然后找到截止点(假设idx列已经排序):

cutoff = df[df['y'] == 0].idx.min()

df['y']==0是您的条件。然后得到满足该条件的最小idx,并将其保存为我们的截止值。你知道吗

最后,使用截断创建一个新的数据帧:

df_new = df[df.idx <= cutoff].copy()

输出:

df_new

   idx  x   y
0   0   a   3
1   1   b   2
2   2   c   0

你可以这样做,这里np.where返回一个元组,因此我们使用np.where(df.y == 0)访问索引的值作为元组的第一个元素,然后第一个出现的值作为这个向量的最后一个元素返回,最后我们将1添加到索引中,这样我们可以在切片时包含上一个出现的索引

df_cond = df.iloc[:np.where(df.y == 0)[0][-1]+1, :]

或者你可以:

df_cond  = df[ :df.y.eq(0).cumsum().idxmax()+1 ]

方法一:

Usngindex.max&;iloc

  • index.max获取条件为y==0的最后一行
  • iloc对使用df['y'].eq(0)找到的索引上的数据帧进行切片
idx = df.query('y.eq(0)').index.max()+1 
# idx = df.query('y==0').index.max()+1 -- if pandas < 0.25 

df.iloc[:idx]

输出

   x  y
0  a  3
1  b  2
2  c  0

方法二:

使用np.where

idx = np.where(df['y'].eq(0), df.index, 0).max()+1
df.iloc[:idx]

输出

   x  y
0  a  3
1  b  2
2  c  0

相关问题 更多 >