我有一个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。什么是一种简单的方法呢?
谢谢!
答案 0 :(得分:1)
您可以收集具有最大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)
答案 1 :(得分:0)
如果数据如下所示:
Timestamp u1 u2 u3
0 0.00000 23.02712 30.46594
2 0.00000 22.31358 30.10915
4 0.00000 19.10267 25.47093
6 0.00000 18.38913 23.68700
8 0.00000 19.81620 23.68700
10 0.00000 18.03236
16 1 2 3
然后
import numpy as np
import pandas as pd
chunksize = 4 # change this to 90000
df = pd.read_table('data', sep='\s+')
df['index'] = df['Timestamp']//chunksize
result = df.loc[df.groupby('index')['u3'].idxmax()]
N = result['index'].max()
result.set_index('index', inplace=True)
result = result.reindex(index=np.arange(N+1))
print(result)
产量
Timestamp u1 u2 u3
0 0 0 23.02712 30.46594
1 4 0 19.10267 25.47093
2 8 0 19.81620 23.68700
3 NaN NaN NaN NaN
4 16 1 2.00000 3.00000
我使用了4的chunksize来使小数据集上的分组显而易见;您将要为真实数据集将其更改为90000。
主要想法是计算df['Timestamp']//chunksize
并在调用df.groupby
时使用这些值,将所需的行组合在一起。
df.groupby('index')['u3'].idxmax()
查找每个组的最大u3
值的行的索引标签。
在没有数据的情况下插入NaN,方法是将index
列设为索引,然后调用reindex
。
result = result.reindex(index=np.arange(N+1))