Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两个日期时间之间的平均值;如果为NaN,则获取最后一个非NaN值_Python_Pandas_Dataframe - Fatal编程技术网

Python 两个日期时间之间的平均值;如果为NaN,则获取最后一个非NaN值

Python 两个日期时间之间的平均值;如果为NaN,则获取最后一个非NaN值,python,pandas,dataframe,Python,Pandas,Dataframe,昨天我问了一个问题(有一些好的答案),这个问题非常相似,但与我现在遇到的问题略有不同。假设我有以下pd.DataFrame(): 我想获得每个唯一id的val的平均值,这些id位于begin\u timestamp和end\u timestamp之间。如果没有满足该条件的行,我想获取该期间之前id的最后一个值。请注意,在本例中,id=2没有满足条件的行。以前,我可以对数据进行切片,这样我只保留begin和end_时间戳之间的行,然后使用groupby。然后,我上一篇文章中的解决方案将替换grou

昨天我问了一个问题(有一些好的答案),这个问题非常相似,但与我现在遇到的问题略有不同。假设我有以下
pd.DataFrame
():

我想获得每个唯一id的
val
的平均值,这些id位于
begin\u timestamp
end\u timestamp
之间。如果没有满足该条件的行,我想获取该期间之前
id
的最后一个值。请注意,在本例中,id=2没有满足条件的行。以前,我可以对数据进行切片,这样我只保留begin和end_时间戳之间的行,然后使用groupby。然后,我上一篇文章中的解决方案将替换groupby对象中的NaN值。但是,在上面的示例中,id=2根本没有满足条件的行,因此没有创建可以替换的NaN值。因此,如果我根据上述标准对数据进行切片:

sliced = df[(df.eff_timestamp > df.begin_timestamp) & (df.eff_timestamp < df.end_timestamp)]
sliced
>>>     

    eff_timestamp       val         id  begin_timestamp     end_timestamp
3   2021-01-01 03:00:00 0.788685    1   2021-01-01 02:00:00 2021-01-01 05:30:00
4   2021-01-01 04:00:00 0.505210    1   2021-01-01 02:00:00 2021-01-01 05:30:00
5   2021-01-01 05:00:00 -0.738344   1   2021-01-01 02:00:00 2021-01-01 05:30:00

sliced.groupby('id').val.mean()
>>>
id
1    0.185184
Name: val, dtype: float64
sliced=df[(df.eff\u时间戳>df.begin\u时间戳)和(df.eff\u时间戳>>     
eff_timestamp val id begin_timestamp end_timestamp
3   2021-01-01 03:00:00 0.788685    1   2021-01-01 02:00:00 2021-01-01 05:30:00
4   2021-01-01 04:00:00 0.505210    1   2021-01-01 02:00:00 2021-01-01 05:30:00
5   2021-01-01 05:00:00 -0.738344   1   2021-01-01 02:00:00 2021-01-01 05:30:00
sliced.groupby('id').val.mean()
>>>
身份证件
1    0.185184
名称:val,数据类型:float64

此结果仅包括id=1和平均值,但id=2没有值。如何将id=2的最后一个可用值,即-0.349705,而不是平均值包括在内?

在两个时间之间创建一个临时列
。然后按
id
列分组,然后在
apply
中添加条件->如果对于特定的
id
是否有任何值在该范围内?如果是,则取平均值,否则取
last\u valid\u index
处的值

result = (
    df.assign(
        between_time=(df.eff_timestamp > df.begin_timestamp) & (df.eff_timestamp < df.end_timestamp))
    .groupby('id')
    .apply(
        lambda x: x.loc[x['between_time']]['val'].mean()
        if any(x['between_time'].values)
        else
        x.loc[x['val'].last_valid_index()]['val']
    )
)

嗨,纳曼,非常感谢!这似乎做得很好。
result = (
    df.assign(
        between_time=(df.eff_timestamp > df.begin_timestamp) & (df.eff_timestamp < df.end_timestamp))
    .groupby('id')
    .apply(
        lambda x: x.loc[x['between_time']]['val'].mean()
        if any(x['between_time'].values)
        else
        x.loc[x['val'].last_valid_index()]['val']
    )
)
id
1    0.185184
2   -0.349705
dtype: float64