熊猫:根据条件在数据框组的末尾删除行

戈尔扬

假设我有以下数据框:

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根据上述条件删除最后一行。

如果您需要更多信息,请告诉我,期待您的答复!

克尔科罗夫

对于特定示例,您刚刚发布了在分组操作之前删除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,并且只想删除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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据条件熊猫在数据框中删除行

根据熊猫数据框中的条件删除每个组的最后一行

合并熊猫数据框并根据条件删除重复的行

根据条件删除熊猫数据框中的重复行

根据条件从熊猫数据框中删除特定的行

Python熊猫根据上述某些行上的条件在数据框中创建新行

如何根据其他数据框中的条件删除熊猫组

根据条件熊猫过滤数据框行

根据条件移动熊猫数据框的行

根据条件删除熊猫组

删除熊猫数据框基于行的条件

如何根据某些条件在数据框中删除重复的行?

在熊猫数据框中根据条件为组创建列

如何根据行索引的条件在熊猫数据框中删除行

根据条件删除Panadas数据框的行

如何根据特定条件在熊猫中删除数据框中的重复行

根据条件熊猫数据框列删除字符串

根据条件在熊猫数据框中删除列

根据熊猫数据框中的条件从列表中删除元素

根据熊猫数据框中的条件从列表中删除元素

根据表中的条件在数据框中复制行

处理大量行(熊猫数据框)以根据条件过滤行

在熊猫数据框中,如何根据满足不同条件的开始行和结束行过滤一组行?

如何在数据框中有条件地将一组行传输到第一行的末尾

根据条件删除行组

熊猫根据条件删除行

根据多列条件过滤熊猫数据框行

如何根据条件对熊猫数据框的行值进行排序?

根据条件在熊猫数据框中添加新行