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