簡體   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