让我们假设这样的数据帧:
idx x y
0 a 3
1 b 2
2 c 0
3 d 2
4 e 5
如何根据条件修整底部的行,以便删除在 last 之后符合条件的任何行?
例如:
with the following condition: y == 0
输出应为
idx x y
0 a 3
1 b 2
2 c 0
这种情况可能会发生很多次,但最后一个是触发切割的情况。
答案 0 :(得分:1)
您可以这样做,这里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 ]
答案 1 :(得分:1)
使用 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
答案 2 :(得分:0)
我会做这样的事情:
df.iloc[:df['y'].eq(0).idxmax()+1]
只需查找条件为真的最大索引。
编辑
因此上述代码将无法正常工作,因为idxmax()仍仅采用值为真的第一个索引。因此,我们可以执行以下操作来欺骗它:
df.iloc[:df['y'].eq(0).sort_index(ascending = False).idxmax()+1]
翻转索引,所以最后一个索引是idxmax拾取的第一个索引。
答案 3 :(得分: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