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

2024-04-19 21:12:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下类似的数据:

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

因此,上述带有滚动(窗口=3)的df的输出为:

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']

Tags: falsetruedfnp情况nanall次数
1条回答
网友
1楼 · 发布于 2024-04-19 21:12:51

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

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

相关问题 更多 >