【问题标题】:Using pandas to drop all observations in a group after a condition has been met满足条件后使用 pandas 删除组中的所有观察值
【发布时间】:2013-12-05 00:03:47
【问题描述】:

我有一个基本上是不平衡面板的 pandas 数据框。我想要做的是,对于每个组,在满足条件后放弃所有观察。所以给定这个数据集:

person    period    hasTattoo
  A         1          N
  A         2          Y
  A         3          Y
  A         4          Y
  B         1          N
  B         2          N
  C         1          Y
  C         2          Y

我想得到这个:

person    period    hasTattoo
  A         1          N
  A         2          Y
  B         1          N
  B         2          N
  C         1          Y

我只包括条件不满足的时期,以及满足条件的时期,之后什么都没有。在 R 中,我可以只使用 data.table。

dat[, subCount := 1:.N, by = c("person", "hasTattoo")]
dat <- dat[!(hasTattoo=="Y" & subCount > 1),]

【问题讨论】:

    标签: python r pandas


    【解决方案1】:

    对于熊猫 0.12

    def f(df):
        mask = np.cumsum((df.hasTattoo == "Y").values) <= 1
        return df[mask]
    
    df.groupby("person").apply(f)
    

    对于熊猫 0.13

    def f(df):
        mask = (df.hasTattoo == "Y").cumsum() <= 1
        return df[mask]
    
    df.groupby("person").apply(f)
    

    【讨论】:

    • 嘘!谢谢谢谢。抱歉这个愚蠢的问题,但是 .values 方法是干什么用的?
    • .values 获取原始 ndarray 值,我使用它是因为我的 pandas 版本(0.12)中有一些错误不能 cumsum bool 系列。这是在 0.13 中修复的,因此您可以使用 Series 对象的.cumsum() 方法。
    • 没有累积或在熊猫中?
    猜你喜欢
    • 2015-05-16
    • 2018-10-24
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多