簡體   English   中英

將Pandas DataFrame中的行追加到新的DataFrame

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM