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