我有一个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)