我的 df 如下所示:
CX CY CS
97539 0.39896 0.7787 0
97540 0.39896 0.7787 0
97541 0.39896 0.7787 0
97542 0.39896 0.7787 0
97543 0.39896 0.7787 0
97544 0.39896 0.7787 0
97545 0.39896 0.7787 0
97546 0.39896 0.7787 0
97547 0.39896 0.7787 0
97548 0.39896 0.7787 0
97549 0.39896 0.7787 0
97550 0.39896 0.7787 0
97551 0.39896 0.7787 0
97552 0.39896 0.7787 0
97553 0.39896 0.7787 0
97554 0.39896 0.7787 0
97555 0.39896 0.7787 0
97556 0.39896 0.7787 0
97557 0.39896 0.7787 0
97558 0.39896 0.7787 0
97559 0.39896 0.7787 0
97560 0.39896 0.7787 0
97561 0.39896 0.7787 1
97562 0.39896 0.7787 0
97563 0.39896 0.7787 0
97564 0.39896 0.7787 0
97565 0.39896 0.7787 0
我只想保留 df 的一部分,直到“CS”列上的值变为 1 并删除其余行。所以我想要这样的东西:
CX CY CS
97539 0.39896 0.7787 0
97540 0.39896 0.7787 0
97541 0.39896 0.7787 0
97542 0.39896 0.7787 0
97543 0.39896 0.7787 0
97544 0.39896 0.7787 0
97545 0.39896 0.7787 0
97546 0.39896 0.7787 0
97547 0.39896 0.7787 0
97548 0.39896 0.7787 0
97549 0.39896 0.7787 0
97550 0.39896 0.7787 0
97551 0.39896 0.7787 0
97552 0.39896 0.7787 0
97553 0.39896 0.7787 0
97554 0.39896 0.7787 0
97555 0.39896 0.7787 0
97556 0.39896 0.7787 0
97557 0.39896 0.7787 0
97558 0.39896 0.7787 0
97559 0.39896 0.7787 0
97560 0.39896 0.7787 0
97561 0.39896 0.7787 1
任何想法如何处理它?请注意,1 的值可以在任何行,所以我不能只使用 .iloc()。理想情况下,我想避免 itterrows()。
答案 0 :(得分:0)
如果总是至少有一个 1
可能通过 Series.eq
比较值,然后通过 Series.idxmax
获取第一个 1
的索引,最后通过 {{3} 过滤}:
df1 = df.loc[: df['CS'].eq(1).idxmax()]
如果也没有 1
值,则解决方案有效 - 然后返回空数据帧:
m = df['CS'].eq(1)
df1 = df.loc[: m.idxmax()] if m.any() else pd.DataFrame()
或者在 DataFrame.loc
中使用 Series.cummax
的技巧,只需要更改订单 2 次:
df1 = df[df['CS'].iloc[::-1].eq(1).cummax().iloc[::-1]]