假设我有以下数据框:
df = pd.DataFrame({"id": [1, 1, 1, 2, 2, 2, 3, 3, 3, 3], "date": [pd.Timestamp(2002, 2, 2), pd.Timestamp(2003, 3, 3), pd.Timestamp(2004, 4, 4), pd.Timestamp(2005, 5, 5), pd.Timestamp(2006, 6, 6), pd.Timestamp(2007, 7, 7), pd.Timestamp(2008, 8, 8), pd.Timestamp(2009, 9, 9), pd.Timestamp(2010, 10, 10), pd.Timestamp(2011, 11, 11)], "numeric": [0.9, 0.4, 0.2, 0.6, np.nan, 0.8, 0.7, np.nan, np.nan, 0.5], "nominal": [0, 1, 0, 1, 0, 0, 0, 1, 1, 1]})我想要实现的是在每个组的末尾id去除行(假设行按 分组),这样这些行将被删除,直到non-nan该numeric列出现一个值。此外,每个组的最后一行将始终具有non-nan该numeric列的值,并且应始终删除最后一行。因此,生成的数据帧是:
result_df = pd.DataFrame({"id": [1, 1, 2, 3], "date": [pd.Timestamp(2002, 2, 2), pd.Timestamp(2003, 3, 3), pd.Timestamp(2005, 5, 5), pd.Timestamp(2008, 8, 8)], "numeric": [0.9, 0.4, 0.6, 0.7], "nominal": [0, 1, 1, 0]})关于我们如何获得结果数据帧的更多解释:
因为id == 1只有最后一行被删除,因为在最后一行之前的行中有该numeric列的值。
对于id == 2最后两行被删除,因为最后一行默认情况下,该行的最后一个具有前去除nan值。
对于id == 3被删除的最后三个行,因为最后一行是默认和第一去除non-nan值从低于第四行计数。
此外,我目前正在做的是:
df.groupby("id", as_index=False).apply(lambda x: x.iloc[:-1]).reset_index(drop=True)但是,这只会删除每个组的最后一行,我想N根据上面解释的条件删除最后一行。
如果您需要任何进一步的信息,请告诉我,并期待您的回答!
哔哔one
心有法竹
随时随地看视频慕课网APP
相关分类