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

时间:2014-09-29 21:04:06

标签: python pandas 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()知道索引)并将其附加到新数据帧?还有NaN问题,这意味着如果在所述间隔中没有数据,则脚本应该为该行中的所有列添加NaN。什么是一种简单的方法呢?

谢谢!

2 个答案:

答案 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))