簡體   English   中英

使用 pandas 根據條件分組中的上個月最后一個值,將所有空值替換為最后一行

[英]Using pandas replace all empty values with last row based on previous month last value in a group by condition

我有一個 dataframe 如下圖

使用 pandas dataframe 我想根據上個月最后一個值從 groupby 條件的第一行替換列中的空值

直到最后一個日期基於每個 ID 扇區使用情況,應填寫價格列值。

ID    Sector    Usage     Price   Date 
1     A         R         20      29/08/2022
1     A         R         30      30/08/2022
1     A         R         40      31/08/2022
1     A         R                 01/09/2022
1     A         R                 02/09/2022
.     .         .          .          . 
.     .         .          .          . 
1     A         R                 30/09/2022
.     .         .          .          . 
.     .         .          .          .
1     A         R                 31/10/2022
.     .         .          .          . 
.     .         .          .          .
1     A         R                 30/11/2022
2     B         C         200     31/08/2022
3     B         R         60      31/08/2022

預期輸出

ID    Sector    Usage     Price    Date
   
1     A         R         20      29/08/2022
1     A         R         30      30/08/2022
1     A         R         40      31/08/2022
1     A         R                 01/09/2022
1     A         R                 02/09/2022
.     .         .          .          . 
.     .         .          .          . 
1     A         R          40       30/09/2022
.     .         .          .          . 
.     .         .          .          .
1     A         R          40       31/10/2022
.     .         .          .          . 
.     .         .          .          .
1     A         R          40      30/11/2022
2     B         C          200      31/08/2022
2     B         C          200      01/09/2022
.     .         .          .          . 
.     .         .          .          . 
2     B         C          200      31/10/2022
.     .         .          .          . 
.     .         .          .          . 
2     B         C          200      31/12/2022
3     B         R          60       31/08/2022

我嘗試了以下代碼但無法正常工作

m = df['Price'] == ''
s = df.assign(Price=df['Price'].mask(m)).groupby(['Sector','Usage'])['Price'].ffill()
df['Price'] = np.where(m, s, df['Price']).astype(int)

或者

df.replace({'Price': {0:np.NaN}}).ffill()

假設您的空值是空字符串:

import pandas as pd
import numpy as np

df = pd.DataFrame.from_dict({"fills": [100, 200, "", 40, "", 5]})

df["fills"].replace("", np.nan, regex=True).fillna(method="ffill")

Output:

  fills
0   100
1   200
2      
3    40
4      
5     5

   fills
0    100.0
1    200.0
2    200.0
3     40.0
4     40.0
5      5.0

並使用 groupby / transform:

df = pd.DataFrame.from_dict({"fills": [100, 200, "", 40, "", 5], "grps": ["A", "B", "C", "A", "A", "B"]})

df["fills"] = df.groupby(by=["grps"])["fills"].transform(lambda x: x.replace("", np.nan)).fillna(method="ffill")

Output:

  fills grps
0   100    A
1   200    B
2          C
3    40    A
4          A
5     5    B
    
   fills grps
0  100.0    A
1  200.0    B
2  200.0    C
3   40.0    A
4   40.0    A
5    5.0    B

暫無
暫無

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

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