我有以下数据帧结构:
import pandas as pd
import numpy as np
np.random.seed(0)
rng = pd.date_range('2021-02-24', periods=74, freq='H')
df = pd.DataFrame({ 'datetime': rng, 'X1': np.random.randn(len(rng)), 'X2': np.nan })
df.X2.iloc[15] = 115
df.X2.iloc[3] = 130
df.X2.iloc[69] = 138
df.X2.iloc[31] = 221
df
datetime X1 X2
0 2021-02-24 00:00:00 1.76 NaN
1 2021-02-24 01:00:00 0.40 NaN
2 2021-02-24 02:00:00 0.98 NaN
3 2021-02-24 03:00:00 2.24 130.00
4 2021-02-24 04:00:00 1.87 NaN
.. ... ... ...
69 2021-02-26 21:00:00 0.05 138.00
70 2021-02-26 22:00:00 0.73 NaN
71 2021-02-26 23:00:00 0.13 NaN
72 2021-02-27 00:00:00 1.14 NaN
73 2021-02-27 01:00:00 -1.23 NaN
[74 rows x 3 columns]
我想创建一个新的数据框 df_new,其中每次 df 的日期时间列到达 tms 00:00:00 时都有一行。 对于 df 中的每一列,new_df 的相应列必须包含前 24 小时内最后一个非 nan 值,如下所示:
df_new = pd.DataFrame({ 'last_valid_X1': [-0.742165,0.77749,0.128983], 'last_valid_X2': [115,221,138] })
df_new
last_valid_X1 last_valid_X2
0 -0.74 115
1 0.78 221
2 0.13 138
因为有 3 天的观察,所以有 3 行(为方便起见,不包括 00:00:00 的第一个时间戳)。 new_df 的第一行包含从日期时间 2021-02-24 01:00:00 到 2021-02-25 00:00 的 X1 和 X2 的最后一个有效测量值: 00. new_df 的第二行包含从日期时间 2021-02-25 01:00:00 到 2021-02-26 00:00 的 X1 和 X2 的最后一个有效测量值: 00 等等...
我已经为问题的各个步骤寻找了解决方案,例如:
-如何获取最后一个有效索引 Locate first and last non NaN values in a Pandas DataFrame
-如何获取特定列的索引 Python Pandas: Get index of rows which column matches certain value
但我对问题的整体逻辑感到很困惑。