结合熊猫的行

时间:2015-04-20 09:26:48

标签: python pandas

我有像这样的pandas DataFrame

         100  200  300
283.1   0.01 0.02 0.40
284.1   0.02 0.03 0.42
285.1   0.05 0.01 0.8
286.1   0.06 0.02 0.9

我需要组合一定数量的连续行并计算每列的平均值和新索引作为我使用的索引的平均值,以获得如下所示:< / p>

         100   200  300
283.6   0.015 0.025 0.41  
285.6   0.055 0.015 0.85

pandas有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:2)

是的 - 你可以在熊猫中做到这一点。这是一种方法。

让我们说出来,我们的初始数据框df就像

   index   100   200   300
0  283.1  0.01  0.02  0.40
1  284.1  0.02  0.03  0.42
2  285.1  0.05  0.01  0.80
3  286.1  0.06  0.02  0.90

现在,计算数据帧的长度

N = len(df.index)
N
4

我们创建一个grp列 - 用于聚合,

其中for 2 rows聚合使用[x ]*2n-consecutive rows聚合使用[x]*n

df['grp'] = list(itertools.chain.from_iterable([x]*2 for x in range(0, N/2)))
df
   index   100   200   300  grp
0  283.1  0.01  0.02  0.40    0
1  284.1  0.02  0.03  0.42    0
2  285.1  0.05  0.01  0.80    1
3  286.1  0.06  0.02  0.90    1

现在,通过将grp列分组来获取方法 -

df.groupby('grp').mean()
     index    100    200   300
grp
0    283.6  0.015  0.025  0.41
1    285.6  0.055  0.015  0.85

答案 1 :(得分:0)

一种简单的方法:

>>> print df
   index   100   200   300                                                        
0  283.1  0.01  0.02  0.40                                                        
1  284.1  0.02  0.03  0.42                                                        
2  285.1  0.05  0.01  0.80                                                        
3  286.1  0.06  0.02  0.90 

DataFrame分解为您想要的部分并找到相关列的mean

>>> pieces = [df[:2].mean(), df[2:].mean()]    

然后使用concat将这些碎片重新组合在一起:

>>> avgdf = pd.concat(pieces, axis=1).transpose()

   index    100    200   300                                                      
0  283.6  0.015  0.025  0.41                                                      
1  285.6  0.055  0.015  0.85

或者,您可以使用列表推导[i for i in pieces]或生成器表达式重新组合数据:

>>> z = (i for i in pieces)

并使用此功能创建新的DataFrame

>>> avgdf = pd.DataFrame(z)

最后,设置索引:

>>> avgdf.set_index('index', inplace=True)                                                 
>>> print avgdf

         100    200   300                                                         
index                                                                             
283.6  0.015  0.025  0.41                                                         
285.6  0.055  0.015  0.85