2024-04-25 01:03:40 发布
网友
假设这样的数据帧:
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
这种情况可能发生很多次,但最后一次是触发切割的情况。你知道吗
设置数据帧:
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添加到索引中,这样我们可以在切片时包含上一个出现的索引
np.where
np.where(df.y == 0)
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
iloc
y==0
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]
设置数据帧:
然后找到截止点(假设idx列已经排序):
df['y']==0是您的条件。然后得到满足该条件的最小idx,并将其保存为我们的截止值。你知道吗
最后,使用截断创建一个新的数据帧:
输出:
你可以这样做,这里
np.where
返回一个元组,因此我们使用np.where(df.y == 0)
访问索引的值作为元组的第一个元素,然后第一个出现的值作为这个向量的最后一个元素返回,最后我们将1添加到索引中,这样我们可以在切片时包含上一个出现的索引或者你可以:
方法一:
Usng
index.max
&;iloc
:index.max
获取条件为y==0
的最后一行iloc
对使用df['y'].eq(0)
找到的索引上的数据帧进行切片输出
方法二:
使用
np.where
输出
相关问题 更多 >
编程相关推荐