我有一个Pandas数据框,其前6行如下所示:

               Timestamp     u1                 u2                  u3
0              0             0.00000            23.02712            30.46594
1              2             0.00000            22.31358            30.10915
2              4             0.00000            19.10267            25.47093
3              6             0.00000            18.38913            23.68700
4              8             0.00000            19.81620            23.68700
5             10             0.00000            18.03236            21.18952


此数据由数据记录器捕获,并且在某些情况下会触发该数据记录器。意思是,时间戳记值(以100秒为单位)并不总是遵循严格的顺序,并且当数据记录器处于非活动状态时,数据在时间上可能存在间隙。

我试图捕获每15分钟捕获的最大u3值和其他列中的相应值(意味着从同一行出现最大u3)。转换为我的时间戳值时,这是每15 x 60 x 100 = 90000 1/100秒。

我设法使用下面的脚本来获取最大u3值的位置(目前仅打印索引号):

counter = df.Timestamp.max()/90000
for i in range(counter):
    df_temp = df[(df.Timestamp >= i*90000) & (df.Timestamp < (i+1)*90000)]
    try:
        print df_temp["u3"].argmax()
    except ValueError:
        print "NaN"


我想做的是从这些位置收集整行并将它们附加到新的数据帧中,索引值在上面给出的脚本中为i。如何获得整行(因为我通过argmax()知道索引)并将其附加到新的数据框中?还存在NaN问题,这意味着,如果在上述时间间隔内没有数据,则脚本应为该行中的所有列添加NaN。有什么简单的方法可以做到这一点?

谢谢!

最佳答案

您可以收集具有最大u3值的数据帧,然后使用pd.concat将它们放回一起-

counter = df.Timestamp.max()/90000
collected_dfs = []
for i in range(counter):
    df_temp = df[(df.Timestamp >= i*90000) & (df.Timestamp < (i+1)*90000)]
    try:
        if len(df_temp):
            collected_dfs.append(df_temp[df_temp['u3'] == df_temp['u3'].max()])
        else:
            df_nan = pd.DataFrame({'Timestamp': [i*90000], 'u1': [np.nan], 'u2': [np.nan], 'u3': [np.nan]})
            collected_dfs.append(df_nan)
    except ValueError:
        print "NaN"
pd.concat(collected_dfs, ignore_index=True)

10-08 07:15