2014-09-29 38 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)) 
相關問題