【问题标题】:filter rows to keep only until last occurence of a condition过滤行以仅保留到最后一次出现条件
【发布时间】:2022-01-07 17:46:52
【问题描述】:

我在 groupby 之后有一个基于 id 的数据框。

import pandas as pd
df = pd.DataFrame({'date': ['2022/01/01', '2022/01/02', '2022/01/03', '2022/01/04', '2022/01/05', '2022/01/06', '2022/01/07', '2022/01/08', '2022/01/09', '2022/01/10', '2022/01/11', '2022/01/12', '2022/01/13', '2022/01/14', '2022/01/15', '2022/01/16', '2022/01/17', '2022/01/18', '2022/01/19', '2022/01/20', '2022/01/21', '2022/01/22', '2022/01/23', '2022/01/24', '2022/01/25', '2022/01/26', '2022/01/27', '2022/01/28', '2022/01/29', '2022/01/30', '2022/01/31'],
                   'value': [1, 3, 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]})

在上述数据框中,2022/01/06 之后的值为零。所以我想确定这样的日期,在该日期之后值保持为零并删除它们。 预期的输出数据帧是

>>> df
         date  value
 0  2022/01/01  1
 1  2022/01/02  3
 2  2022/01/03  5
 3  2022/01/04  0
 4  2022/01/05  0
 5  2022/01/06  2

所以在示例中,我应该能够确定 2022/01/06 是取消日期,因为之后所有日期的值都是 0。

【问题讨论】:

  • 你的问题是......?你的尝试到底在哪里失败了?
  • @Neither 想不出一种方法来以一种简洁的方式识别这样的日期并以此为基础删除,不想申请循环。

标签: python pandas dataframe


【解决方案1】:

使用Series.ilocSeries.cumsum 的倒置系列中的累积和,并比较不等于0 - 因此它会删除boolean indexing 中每列value 中的所有最后0 值:

df = df[df['value'].iloc[::-1].cumsum().iloc[::-1].ne(0)]
print (df)
         date  value
0  2022/01/01      1
1  2022/01/02      3
2  2022/01/03      5
3  2022/01/04      0
4  2022/01/05      0
5  2022/01/06      2

有没有可能:

df.drop(df[df['value'].iloc[::-1].cumsum().eq(0).iloc[::-1]].index)

编辑:GroupBy.cumsum 的每组解决方案:

df = df[df.iloc[::-1].groupby('ID')['value'].cumsum().iloc[::-1].ne(0)]

【讨论】:

  • df.drop(df[(df['value'].iloc[::-1].cumsum().ne(0).iloc[::-1] == False) ]。指数);我为我的用例做了一点改动。我想在 dataframe 上的 groupby 之后应用这个,以便每个组都会发生。你能建议吗? df.groupby('ID').drop(...)
  • @007 - 为什么需要 drop ?添加了groupby 的解决方案
  • 我必须在 groupby 子句中再添加一个条件。在这里问stackoverflow.com/questions/70678001/…
【解决方案2】:

现在只是想这个解决方案,在屏蔽列上使用last_valid_index

df.loc[:df['value'].mask(df['value'].eq(0)).last_valid_index()]

输出:

         date  value
0  2022/01/01      1
1  2022/01/02      3
2  2022/01/03      5
3  2022/01/04      0
4  2022/01/05      0
5  2022/01/06      2

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 2021-08-04
    • 2021-01-21
    • 1970-01-01
    • 2023-03-04
    • 2011-10-11
    • 2018-07-07
    • 1970-01-01
    相关资源
    最近更新 更多