簡體   English   中英

根據條件修剪熊貓數據框的最后一行

[英]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 ]

方法1:

Usng index.maxiloc

  • 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

我會做這樣的事情:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM