根据条件修剪熊猫数据框的最后一行

时间:2019-07-26 22:55:39

标签: python pandas

让我们假设这样的数据帧:

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

这种情况可能会发生很多次,但最后一个是触发切割的情况。

4 个答案:

答案 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)

方法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

方法2:

使用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