Pandas:根据条件在数据帧组末尾剥离行

假设我有以下数据框:

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-nannumeric列出现一个值。此外,每个组的最后一行将始终具有non-nannumeric列的值,并且应始终删除最后一行。因此,生成的数据帧是:

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
浏览 216回答 1
1回答

心有法竹

对于您发布的特定示例,在分组之前仅删除 NaN 即可:df = df.dropna().groupby('id').apply(lambda x: x.iloc[:-1]).reset_index(drop=True)dfOut[58]:    id       date  numeric  nominal0   1 2002-02-02      0.9        01   1 2003-03-03      0.4        12   2 2005-05-05      0.6        13   3 2008-08-08      0.7        0如果您有一个不连续的 NaN 并且只想删除最后一个 NaN 块:def strip_rows(X):        X = X.iloc[:-1, :]    while pd.isna(X.iloc[-1, 2]):                X = X.iloc[:-1, :]    return Xdf_1 = pd.DataFrame({"id": [1, 1, 1, 2, 2, 2, 3, 3, 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),                            pd.Timestamp(2011, 12, 12),                            pd.Timestamp(2012, 1, 1)],                    "numeric": [0.9, 0.4, 0.2, 0.6, np.nan, 0.8, 0.7, np.nan, np.nan, 0.5, np.nan, 0.3],                    "nominal": [0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1]})df_2 = df_1.groupby('id').apply(strip_rows).reset_index(drop=True)df_1Out[151]:     id       date  numeric  nominal0    1 2002-02-02      0.9        01    1 2003-03-03      0.4        12    1 2004-04-04      0.2        03    2 2005-05-05      0.6        14    2 2006-06-06      NaN        05    2 2007-07-07      0.8        06    3 2008-08-08      0.7        07    3 2009-09-09      NaN        18    3 2010-10-10      NaN        19    3 2011-11-11      0.5        110   3 2011-12-12      NaN        011   3 2012-01-01      0.3        1df_2Out[152]:    id       date  numeric  nominal0   1 2002-02-02      0.9        01   1 2003-03-03      0.4        12   2 2005-05-05      0.6        13   3 2008-08-08      0.7        04   3 2009-09-09      NaN        15   3 2010-10-10      NaN        16   3 2011-11-11      0.5        1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python