我有一個資料框。我檢查一行是好是壞。如果一行不好,我想洗掉這一行和前兩行(n=2)。在我的實際問題中 n=60。我有一個可行的解決方案。有沒有更好的辦法?檢查我的解決方案是否是 Pythonic 的做法。我的代碼:
df = pd.DataFrame({'A':[10,20,30,40,50],'isBad?':[False,False,True,False,False]})
df =
A isBad?
0 10 False
1 20 False
2 30 True
3 40 False
4 50 False
預期答案:
df =
A isBad?
1 40 False
2 50 False
我的解決方案:
bad_row_index = pd.concat(df.loc[i-2:i:1] for i,r in xdf.iterrows() if r['isBad?']==True).drop_duplicates(keep='first').index
df[~df.index.isin(bad_row_index)].reset_index(drop=True,inplace=True)
df =
A isBad?
1 40 False
2 50 False
uj5u.com熱心網友回復:
有趣的問題!
經過一番探索,我想出了一個非常簡短的解決方案:
subset = df[~(df['isBad?'] | df['isBad?'].shift(-1) | df['isBad?'].shift(-2))]
輸出:
>>> subset
A isBad?
3 40 False
4 50 False
一個動態版本(這樣您就可以更改先前洗掉的行數而無需手動撰寫更多.shift()s):
import functools as ft
n = 2 # Drop all True's and the 2 previous ones
subset = df[~ft.reduce(lambda x,y: x|y, [df['isBad?'].shift(-i) for i in range(n 1)])]
輸出:
>>> subset
A isBad?
3 40 False
4 50 False
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/386230.html
上一篇:合并重疊索引
