gpt4 book ai didi

python - Pandas:根据条件去除数据帧组末尾的行

转载 作者:行者123 更新时间:2023-12-01 01:13:27 25 4
gpt4 key购买 nike

假设我有以下数据框:

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分组),这样这些行将被删除,直到非- nan 值将出现在numeric 列中。此外,每个组的最后一行的numeric 列始终具有non-nan 值,并且应始终删除最后一行。因此,生成的数据帧是:

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,最后三行将被删除,因为默认情况下最后一行将被删除,并且第一个非nan值位于第四行,从下面。

此外,我目前正在做的是:

df.groupby("id", as_index=False).apply(lambda x: x.iloc[:-1]).reset_index(drop=True)

但是,这只会删除每个组的最后一行,我想根据上面解释的条件删除最后 N 行。

如果您需要任何进一步的信息,请告诉我并期待您的答复!

最佳答案

对于您发布的具体示例,只需在分组之前删除 NaN 即可达到目的:

df = df.dropna().groupby('id').apply(lambda x: x.iloc[:-1]).reset_index(drop=True)

df
Out[58]:
id date numeric nominal
0 1 2002-02-02 0.9 0
1 1 2003-03-03 0.4 1
2 2 2005-05-05 0.6 1
3 3 2008-08-08 0.7 0

如果您有一个不连续的 NaN,并且您只想删除最后一 block NaN:

def strip_rows(X):    
X = X.iloc[:-1, :]
while pd.isna(X.iloc[-1, 2]):
X = X.iloc[:-1, :]
return X

df_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_1
Out[151]:
id date numeric nominal
0 1 2002-02-02 0.9 0
1 1 2003-03-03 0.4 1
2 1 2004-04-04 0.2 0
3 2 2005-05-05 0.6 1
4 2 2006-06-06 NaN 0
5 2 2007-07-07 0.8 0
6 3 2008-08-08 0.7 0
7 3 2009-09-09 NaN 1
8 3 2010-10-10 NaN 1
9 3 2011-11-11 0.5 1
10 3 2011-12-12 NaN 0
11 3 2012-01-01 0.3 1

df_2
Out[152]:
id date numeric nominal
0 1 2002-02-02 0.9 0
1 1 2003-03-03 0.4 1
2 2 2005-05-05 0.6 1
3 3 2008-08-08 0.7 0
4 3 2009-09-09 NaN 1
5 3 2010-10-10 NaN 1
6 3 2011-11-11 0.5 1

关于python - Pandas:根据条件去除数据帧组末尾的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54601137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com