首页 > 解决方案 > 根据熊猫中的条件分组和过滤

问题描述

如果满足一列的条件,我想删除整个组,(不要注意列 X1 和 X2):

 Subject  Visit           X1      X2
   A       aaa          1647143  1672244
   A       creamy       1672244  1689707
   A       bbb          1689707  1713090
   B       yyy          1735352  1760283
   B       ice cream    1760283  1788062
   C       foo          1788062  1789885
   C       doo          1789885  1790728

例如,如果“访问”包含字符串“奶油”,所有主题 A 和主题 B 记录将被删除,结果将是:

Subject  Visit      X1      X2

 C       foo    1788062  1789885
 C       doo    1789885  1790728

我试过了:它并没有删除整个组记录

df.groupby(by=['Subject']).apply(lambda d: d[~d['Visit'].str.contains('cream',flags=re.I, regex=True)])

标签: pythonpandasdatabasedataframegroup-by

解决方案


您可以通过首先创建检查是否存在的列进行cream过滤,然后使用 过滤transform,但在布尔值的总和上进行过滤:

(df
.assign(cream = df.Visit.str.contains("cream"))
.loc[lambda df: df.groupby("Subject")
                  .cream
                  .transform("sum")==0, 
     df.columns]
)
Out[14]: 
  Subject Visit       X1       X2
5       C   foo  1788062  1789885
6       C   doo  1789885  1790728

推荐阅读