计算满足条件的滚动窗口上的唯一值



我有以下类似的数据:

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

我想创建一个新列,用于计算在滚动窗口中cat的唯一出现次数,其中cat每秒钟出现的所有次数都为True。

所以上面的df与滚动(窗口=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,但似乎不能在需要时将它们放在一起…感谢任何帮助!

[EDIT]使用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())

相关内容

  • 没有找到相关文章

最新更新