[英]Is there a way to perform lag/lead operations by ignoring NAN values in python?
我有一個數據集,其中包括日期、客戶和值(事件的大小)列。 我想創建一個名為“last_occurance_date”的新列,這是每個客戶最后一次發生事件的時間。 我有一個所有客戶和日期的交叉表,所以我有很多 null 值,這意味着該客戶在該日期沒有發生該事件。
我嘗試使用帶有 shift function 的 group by,但我無法忽略未發生事件的 null 值。
過濾掉 null 值 -> 沒有空值的滯后 -> 與表連接 -> ffill 有效,但有沒有簡單的方法來解決這個問題?
假設你有這個 DataFrame:
日期 | 顧客 | 價值 |
---|---|---|
1 | 啊啊啊 | 10 |
2 | 啊啊啊 | 不適用 |
3 | 啊啊啊 | 20 |
4 | 啊啊啊 | 不適用 |
5 | 啊啊啊 | 50 |
1 | bbb | 不適用 |
2 | bbb | 不適用 |
3 | bbb | 30 |
4 | bbb | 不適用 |
5 | bbb | 50 |
Output Dataframe 應該如下所示:
日期 | 顧客 | 價值 | 上次發生日期 |
---|---|---|---|
1 | 啊啊啊 | 10 | 不適用 |
2 | 啊啊啊 | 不適用 | 1 |
3 | 啊啊啊 | 20 | 1 |
4 | 啊啊啊 | 不適用 | 3 |
5 | 啊啊啊 | 50 | 3 |
1 | bbb | 不適用 | 不適用 |
2 | bbb | 不適用 | 不適用 |
3 | bbb | 30 | 不適用 |
4 | bbb | 不適用 | 3 |
5 | bbb | 50 | 3 |
您可以在掩碼日期上使用自定義groupby
操作:
df['Last Occurrence Date'] = (df['Date'].mask(df['Value'].isna())
.groupby(df['Customer'])
.apply(lambda g: g.ffill().shift())
)
output:
Date Customer Value Last Occurrence Date
0 1 aaa 10.0 NaN
1 2 aaa NaN 1.0
2 3 aaa 20.0 1.0
3 4 aaa NaN 3.0
4 5 aaa 50.0 3.0
5 1 bbb NaN NaN
6 2 bbb NaN NaN
7 3 bbb 30.0 NaN
8 4 bbb NaN 3.0
9 5 bbb 50.0 3.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.