簡體   English   中英

熊貓:根據條件在兩者之間進行填充

[英]Pandas: Fill forward between based on a condition

我想在兩個不同列的兩個數字之間填充值。 我有一個看起來像this(df)的數據框,當我在開始列結束列中有數字時,我只想填充正向 基本上,“開始”表示一個進程正在開始,而“結束”表示該進程正在結束。 因此,僅必須在這兩者之間填寫“ 值”列

這是生成數據的代碼,DF是我想要的。

from datetime import datetime, timedelta
import pandas as pd
import numpy as np
import random
np.random.seed(11) 
date_today = datetime.now()
ndays = 10
df = pd.DataFrame({'date': [date_today + timedelta(days=x) for x in range(ndays)], 
               'Start': pd.Series(np.random.randn(ndays)),     'End':pd.Series(np.random.randn(ndays))})
 df = df.set_index('date')
 df = df.mask(np.random.random(df.shape) < .6)
 df.End[{0,1,2,5,6,9}]=np.nan
 df.Start[5]=1
 df.Start[{1,3,4,2,8, 9}]=np.nan
 df['Value']=np.nan
 df.Value[{0,5}]=[0.3,0.1]
 df

我想獲得一個像這樣的dataframe(DF):

                                 End     Start  Value
date                                                 
2018-06-18 22:34:35.964286       NaN  1.749455    0.3
2018-06-19 22:34:35.964286       NaN       NaN    0.3
2018-06-20 22:34:35.964286       NaN       NaN    0.3
2018-06-21 22:34:35.964286  0.561192       NaN    0.3
2018-06-22 22:34:35.964286       NaN       NaN    NaN
2018-06-23 22:34:35.964286       NaN  1.000000    0.1
2018-06-24 22:34:35.964286       NaN       NaN    0.1
2018-06-25 22:34:35.964286       NaN       NaN    0.1
2018-06-26 22:34:35.964286 -0.031075       NaN    0.1
2018-06-27 22:34:35.964286       NaN       NaN    NaN

提前致謝

嘗試以下操作:首先,您要向前填充。 然后計算“事件”的數量。 然后,如果“事件”的數量為偶數,則用NaN替換值。

df['Value'] = df['Value'].fillna(method='ffill')
temp = (df['End'].shift().notnull().astype(int) + df['Start'].notnull().astype(int)).cumsum()
df.loc[temp % 2 == 0, 'Value'] = np.nan

編輯:我們必須使用shift()來修改'End',因為否則它將在發生它們的同一行中對'End'事件進行計數。 我們希望在“結束”事件發生后立即對其進行計數,以免“結束”行上的“值”無效。

暫無
暫無

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

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