[英]trim last rows of a pandas dataframe based on a condition
让我们假设这样一个数据框:
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
这种情况可能会发生很多次,但最后一个是触发减产的情况。
您可以这样做,这里np.where
返回一个元组,因此我们使用np.where(df.y == 0)
将索引的值作为该元组的第一个元素进行np.where(df.y == 0)
,然后将第一个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 ]
Usng index.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
我会做这样的事情:
df.iloc[:df['y'].eq(0).idxmax()+1]
只要寻找您的条件为真的最大索引。
编辑
因此,上面的代码将无法正常工作,因为idxmax()仍只取值为真的第一个索引。 因此,我们可以执行以下操作来欺骗它:
df.iloc[:df['y'].eq(0).sort_index(ascending = False).idxmax()+1]
翻转索引,因此最后一个索引是idxmax选择的第一个索引。
设置数据框:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.