Pandas:根据条件向前填充数据

3
我希望能够在两个不同列的两个数字之间填充值。我有一个数据框(df),它看起来像这样: 当我在Start columnEnd column中有数字时,我只想填充前面的Value column。 基本上,“Start”表示进程开始,“End”表示进程结束。因此,只能在这两者之间填写Value column
下面是一个用于生成数据的代码,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

我希望获得一个像这样的数据框(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

感谢您的提前帮助。
1个回答

4
尝试这样做:首先进行向前填充。然后计算“事件”的数量。如果“事件”的数量是偶数,则将值替换为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”事件。我们希望“End”事件在发生后立即计数,以便“Value”不会在“End”行上被清空。

你能否向 @Leo 添加细节,为什么要在 df[End] 中进行移位? - Pyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接