繁体   English   中英

计算满足条件的滚动 window 的唯一值

[英]Count unique values over rolling window which meet a condition

我有类似以下的数据:

df = pd.DataFrame({
    'cat': ['a','a','b','c','a','a','c','b', 'b'],
    'cond': [True, True, False, True, False, True, True, True, True]
})

我想创建一个新列,它计算 cat 在滚动 window 上的唯一出现次数,其中所有出现的 cat 都是 True per cond。

所以 output 对于上述 df 与 rolling(window=3) 将是:

df['manual_count'] = pd.Series([np.nan,np.nan,1.0,2.0,1.0,1.0,1.0,3.0,2.0])

我只计算了没有条件的唯一事件,这相当简单:

df['all'] = (
    pd.Series(df['cat'].factorize()[0])
    .rolling(3)
    .apply(lambda x: x.nunique())
)

但是介绍这个条件让我很难过。 我认为答案在于 groupby/apply 但似乎无法根据需要将它们组合在一起......感谢任何帮助!

[编辑] 使用 Myrl 的绝妙想法的最终解决方案:

df['false_once'] = (
    pd.Series(df['cat'].factorize()[0])
    .where(~df['cond'], -1)
    .rolling(3)
    .apply(lambda x: x[x>=0].nunique())
)
df['true_all'] = df['all'] - df['false_once']

如何根据df["cond"]过滤列并用-1之类的标记替换不满足条件的元素? 由于pd.factorize始终返回非负整数,因此您可以在计算唯一元素之前清除负值。 这里有一个快速的单线来传达这个想法:

pd.Series(df['cat'].factorize()[0])
  .where(df['cond'], -1).rolling(3)
  .apply(lambda x: x[x>0].nunique())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM