簡體   English   中英

Python: Function 填寫上一行一個非空值

[英]Python: Function to fill in the previous row of a non-null value

我有一個數據集,它主要是與緊急工作人員工作的輪班長度相關的 timedelta 值。 如果滿足某些條件,則將班次時間與之前的班次長度時間相結合 ['Combined Time']

我遇到的問題是“最終時間”欄目。 為了不重復計算工作時間,如果合並了班次,例如第 3 行和第 6 行,則前一行應顯示 NaT 或 0:00 小時,任何其他行應返回 ['Shift Time'] 值列。

在此處輸入圖像描述

我一直在嘗試編寫一個 function ,我可以應用它可以獲得 ['Final Times'] 列,但在訪問前一行到“Combined Time”值時遇到了麻煩。 到目前為止,我所做的讓我獲得了 2/3,但我完全迷失了填寫 NaT/零部分的部分(第二個 if 或 elif 語句)。

def my_func(x):

    if pd.notnull(x['Combined Time']):
        return x['Combined Time']      
    else:
        return x['Shift Time']
    
df['Final Times'] = df.apply(my_func, axis=1)   

任何幫助將不勝感激!

干杯

您可以使用 pandas where() + bfill()用“檢查”值填充前一行,因此my_func()將對其進行測試以計算“最終時間”。

df['Combined Time'] = df['Combined Time'].where(
                            df['Combined Time'].bfill(limit=1).isnull(), 
                            df['Combined Time'].fillna(pd.Timedelta('0:00:00')))

修改 function:

def my_func(x):
    if pd.notnull(x['Combined Time']):
        if x['Combined Time'] == pd.Timedelta('0:00:00'):
            return pd.NaT
        else:
            return x['Combined Time']
    else:
        return x['Shift Time']

申請:

df['Final Times'] = df.apply(my_func, axis=1)
df

結果:

    Shift Time       Combined Time      Final Times
0   0 days 13:00:00  NaT                0 days 13:00:00
1   0 days 07:00:00  0 days 00:00:00    NaT
2   0 days 01:19:00  0 days 08:19:48    0 days 08:19:48
3   0 days 07:00:00  NaT                0 days 07:00:00
4   0 days 14:00:00  0 days 00:00:00    NaT
5   0 days 02:00:00  0 days 16:00:00    0 days 16:00:00

加載數據:
(請將您的數據和格式粘貼為代碼而不是屏幕截圖)

df = pd.DataFrame({'Shift Time': [pd.Timedelta('13:00:00'), 
                             pd.Timedelta('7:00:00'),
                             pd.Timedelta('1:19:00'),
                             pd.Timedelta('7:00:00'),
                             pd.Timedelta('14:00:00'),
                             pd.Timedelta('2:00:00')],
                  'Combined Time': [np.nan, np.nan, 
                               pd.Timedelta('8:19:48'), 
                               np.nan, 
                               np.nan, 
                               pd.Timedelta('16:00:00')],
                  'Final Times': np.nan * 6})

暫無
暫無

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

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