我有一個Dataframe包含按周分組的日期和 ID
東風:
date id
2022-02-07 1
3
5
4
2022-02-14 2
1
3
2022-02-21 9
10
1
...
...
2022-05-16 ....
我想計算每周有多少 id 從前一周重復
例如,所需的輸出Dataframe將是:
date count
2022-02-07 0
2022-02-14 2 # because id 1 and 3 are present in previous week
2022-02-21 1 # because id 1 is present in previous week
...
我嘗試將 id 分組并為每個 id 計算每個日期重復的次數,但沒有按計劃進行。
uj5u.com熱心網友回復:
解決方案
s = pd.crosstab(df.date, df.id)
(s.eq(s.shift()) & s.ne(0)).sum(1)
解釋
創建一個頻率表crosstab
>>> pd.crosstab(df.date, df.id)
id 1 2 3 4 5 9 10
date
2022-02-07 1 0 1 1 1 0 0
2022-02-14 1 1 1 0 0 0 0
2022-02-21 1 0 0 0 0 1 1
將前一行中的值與當前行進行比較,以檢查重復的值。此外,在比較時確保當前行具有非零值
>>> s.eq(s.shift()) & s.ne(0)
id 1 2 3 4 5 9 10
date
2022-02-07 False False False False False False False
2022-02-14 True False True False False False False
2022-02-21 True False False False False False False
沿列軸對非零值求和以獲得重復 id 的計數:
>>> .sum(1)
date
2022-02-07 0
2022-02-14 2
2022-02-21 1
dtype: int64
uj5u.com熱心網友回復:
您可以嘗試將原始資料框分組并合并列id以列出。然后通過與 比較來計演算法向元素shift。
out = df.groupby('date')['id'].apply(list)
lst = [[j for j in js if j in ks] for js, ks in zip(out, out.shift(fill_value=[[]])) ]
df = pd.DataFrame({'date': out.index,
'count': map(len, lst)})
print(df)
date count
0 2022-02-07 0
1 2022-02-14 2
2 2022-02-21 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/479730.html
下一篇:如何在資料框中顯示最佳相關結果?
