![](/img/trans.png)
[英]return first row with non-null value. if null , then return first row appearance python-pandas
[英]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.