簡體   English   中英

如何為 pandas 中的每個用戶填寫最后一個非空值?

[英]How to fill last non-null value for each user in pandas?

我有一個 df,其中包含顯示產品購買量的用戶旅程。 現在,我想為每個用戶填寫最后一個非空值,因為用戶不會每天都購買。 目前,我有:

date       | user_id | purchase_value
2020-01-01 | 1       | null
2020-01-02 | 1       | 1
2020-01-03 | 1       | null
2020-01-04 | 1       | 4
2020-01-01 | 2       | 55
2020-01-02 | 2       | null

我希望它看起來像這樣:

date       | user_id | purchase_value
2020-01-01 | 1       | null
2020-01-02 | 1       | 1
2020-01-03 | 1       | 1
2020-01-04 | 1       | 4
2020-01-01 | 2       | 55
2020-01-02 | 2       | 55

說明:對於用戶 1,我們在 2020 年 1 月 3 日填寫 1,因為這是 2020 年 1 月 2 日的最后一個非空值。 對於用戶 2,我們在 2020 年 1 月 2 日填寫 55,因為這是 2020 年 1 月 1 日的最后一個非空值。

對於每個 user_id 和日期,我將如何在 pandas 中執行此操作? 此外,日期不必是連續的。 即日期中可能存在空白,在這種情況下,請始終填寫最后一個非空值(無論何時)。

如果您真的只想ffill每個組的最后一個NaN 您需要識別它,然后用它的ffill替換:

# is the value NaN?
m1 = df['purchase_value'].isna()

# is this the last NaN of the group?
# here: is this the first NaN of the group in reverse?
m2 = m1[::-1].groupby(df['user_id']).cumsum().eq(1)

# then replace with the ffill per group
df.loc[m1&m2, 'purchase_value'] = df.groupby(['user_id'])['purchase_value'].ffill()

Output:

         date  user_id  purchase_value
0  2020-01-01        1             NaN
1  2020-01-02        1             1.0
2  2020-01-03        1             1.0
3  2020-01-04        1             4.0
4  2020-01-01        2            55.0
5  2020-01-02        2            55.0

另一種可能的解決方案:

df['aux'] = (
  df.assign(aux = pd.isna(df.purchase_value))
  .groupby('user_id')['aux'].cumsum())
  
(df.assign(
    purchase_value =
    np.where((pd.isna(df.purchase_value)) & (df.aux == df.groupby('user_id')['aux']
    .transform('max')), df.purchase_value.shift(1), df.purchase_value))
    .drop('aux', axis = 1))

Output:

         date  user_id  purchase_value
0  2020-01-01        1             NaN
1  2020-01-02        1             1.0
2  2020-01-03        1             1.0
3  2020-01-04        1             4.0
4  2020-01-01        2            55.0
5  2020-01-02        2            55.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM