[英]Append rows from a Pandas DataFrame to a new DataFrame
我有一個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()
知道了索引)並將其附加到新的數據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)
如果數據如下所示:
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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.