【问题标题】:Pandas: Fill forward between based on a condition熊猫:根据条件向前填充
【发布时间】:2018-06-19 12:48:01
【问题描述】:

我想填充来自两个不同列的两个数字之间的值。我有一个看起来像这样的数据框(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

我想获得一个如下所示的数据框(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

提前致谢

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    试试这个:首先你向前填充。然后计算“事件”的数量。如果“事件”的数量是偶数,则将值替换为 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() 来修改“结束”,否则它将计算发生在同一行的“结束”事件。我们希望在“结束”事件发生后立即对其进行计数,这样“值”就不会在“结束”行上无效。

    【讨论】:

    • 你能补充一下吗@Leo,你为什么在df[完]
    猜你喜欢
    • 2018-06-27
    • 2019-05-04
    • 2019-06-05
    • 2019-04-28
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多