2014-09-29 35 views
1

我有一个熊猫数据框为其前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 

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

我试图捕获在每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

您使用过df.loc [index] =(value)吗?您可以按照这种方式设置行。 – Crazy 2014-09-29 21:22:01

回答

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) 
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的块大小来使小数据集上的分组更明显;您需要将其更改为90000以获取真实数据集。


的主要思想是计算df['Timestamp']//chunksize并在呼叫一起使用这些值来df.groupby,到组所需的行。

df.groupby('index')['u3'].idxmax() 

找到与每个组最大值u3值的行的索引标签。

当没有数据时插入NaN通过将index列作为索引,然后调用reindex来完成。

result = result.reindex(index=np.arange(N+1)) 
相关问题