2017-06-12 93 views
0

我是熊猫新手。所以我想知道是否有更好的方法来完成这项任务。如何使用熊猫来阻止10帧长度的平均数据帧?

我有如下所示格式的数据帧:

Data for DNA geometry parameters

这是从分子动力学的DNA模拟数据。

而且数据集是在这里:BPdata.csv

所以,这里总共1000帧,我的目的是让每一个10帧的平均,因此,在最后,我希望数据像这样的:

Block Base1 Base2 Shear Stretch Stagger ..... 
1  1  66  XX XX  XX 
1  2  65  XX XX  XX 
... ...  ... ... ... ... 
1  33  34  XX XX  XX 

2  1  66  XX XX  XX 
2  2  65  XX XX  XX 
... ...  ... ... ... ... 
2  33  34  XX XX  XX 

3  1  66  XX XX  XX 
3  2  65  XX XX  XX 
... ...  ... ... ... ... 
3  33  34  XX XX  XX 


4  1  66  XX XX  XX 
4  2  65  XX XX  XX 
... ...  ... ... ... ... 
4  33  34  XX XX  XX 

其中1座为1〜10帧和2的平均值代表帧11〜20

虽然,我认为应谨慎分配各行的,我可以完成这些任务指标,我想知道是否有一些方便的方法来完成这项任务。我已经在pandas中查看了一些关于groupby函数的网页,似乎没有这个组每10行就能得到一个块的平均函数。

谢谢!

===============================更新============= =====================

对不起,我不会对我的目的描述清楚,我已经想出一个办法,做任务和一个样本输出以更好地说明我的目的。

对于双链DNA,我们知道它是具有AGCT的双螺旋结构,所以Base1意味着DNA的一个碱基,而Base2意味着另一个链的互补碱基。两个相应的碱基通过氢键连接在一起。

喜欢:

Base1 : AAAGGGCCCTTT 
     |||||||||||| 
Base2 : TTTCCCGGGAAA 

因此,这里在BPdata.csv和基础1和Base2的每个组合是指对DNA碱基。

在这里,在BPdata.csv,这是在不同的时间框架模拟一个33碱基对的DNA标记为1,2,3,4 ... 1000。

然后我想组各10帧时间一起,像1〜10,11〜20,21〜30 ...,以及每个组中,执行平均为每个碱基对。

这里是我想出来的数据:

# -*- coding: utf-8 -*- 

    import pandas as pd 

    ''' 

    Data Input 

    ''' 


    # Import CSV data to Python 


    BPdata = pd.read_csv("BPdata.csv", delim_whitespace = True, skip_blank_lines = False) 
    BPdata.rename(columns={'#Frame':'Frame'}, inplace=True) 

    ''' 

    Data Processing 

    ''' 
    # constant block average parameters 
    Interval20ns = 10 
    IntervalInBPdata = 34 


    # BPdataBlockAverageSummary 
    LEN_BPdata = len(BPdata) 

    # For Frame 1 
    i = 1 
    indexStarting = 0 
    indexEnding = 0 

    indexStarting = indexEnding 
    indexEnding = Interval20ns * IntervalInBPdata * i - 1 

    GPtemp = BPdata.loc[indexStarting : indexEnding] 
    GPtemp['Frame'] = str(i) 
    BPdata_blockOF1K_mean = GPtemp.groupby(['Frame','Base1','Base2']).mean() 
    BPdata_blockOF1K_mean.loc[len(BPdata_blockOF1K_mean)] = str(i) 
    # For Frame 2 and so on 
    i = i + 1 
    indexStarting = indexEnding + 1 
    indexEnding = Interval20ns * IntervalInBPdata * i - 1 
    while (indexEnding <= LEN_BPdata - 1): 
     GPtemp = BPdata.loc[indexStarting : indexEnding] 
     GPtemp['Frame'] = str(i) 
     meanTemp = GPtemp.groupby(['Frame','Base1','Base2']).mean() 
     meanTemp.loc[len(meanTemp)] = str(i)  
     BPdata_blockOF1K_mean = pd.concat([BPdata_blockOF1K_mean,meanTemp]) 
     i = i + 1 
     indexStarting = indexEnding + 1 
     indexEnding = Interval20ns * IntervalInBPdata * i - 1 

,结果是这样的事情,这就是我想要的东西:

Results

这里是样本输出, BPdataresult.csv

但到目前为止,我在那里警告:

SettingWithCopyWarning:尝试在DataFrame的 切片副本上设置一个值。尝试使用的.loc [row_indexer,col_indexer] = 值代替

查看的文档中的注意事项: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy GPtemp [ '帧'] = STR(ⅰ)/home/iphyer/Downloads/dataProcessing.py:62 : SettingWithCopyWarning:尝试在DataFrame的 切片副本上设置一个值。尝试使用的.loc [row_indexer,col_indexer] = 值,而不是

查看文档中的注意事项: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy GPtemp [ '框架'] = STR(I)

,在这里我想知道:

  1. 这个警告是否严重?
  2. 截止groupbyPandas的功能,现在数据帧的索引是(Frame,Base1,Base2)的组合,我怎样才能像原始格式那样分开它们。而是补充#FrameBlock索引。
  3. 我可以改进代码吗?还是使用更多熊猫的方式来完成这项任务?

最好!

+0

假设你的数据框被称为'df',你可以这样做:'df.groupby(DF [” #Frame'] // 10).mean()'。另外,您应该重命名'#Frame'列为“Frame”。 – Abdou

+0

@Abdou,Thx,我已经更新了描述。现在有一些新的问题。 – sikisis

回答

2

在熊猫中分组可以通过多种方式完成。其中一种方法是通过一系列的。所以你可以传递一个具有10个行块值的系列。该解决方案的工作原理如下:

import pandas as pd 
import numpy as np 

#create datafram with 1000 rows 
df = pd.DataFrame(np.random.rand(1000, 1) 

#create series for grouping 
groups_of_ten = pd.Series(np.repeat(range(int(len(df)/10)), 10)) 

#group the data 
grouped = df.groupby(groups_of_ten) 

#aggregate 
grouped.agg('mean') 

分组系列看起来像这样在里面:

In [21]: groups_of_ten.head(20) 
Out[21]: 
0  0 
1  0 
2  0 
3  0 
4  0 
5  0 
6  0 
7  0 
8  0 
9  0 
10 1 
11 1 
12 1 
13 1 
14 1 
15 1 
16 1 
17 1 
18 1 
19 1 
+0

嗨,@Woody Pride,我已经试过你的解决方案,但结果如下图所示:'#Frame Base1 Base2 Shear Stretch Stagger Buckle \ 0 485.803153 16.995941 50.004059 0.017325 -0.042114 0.067136 1.731197 '但我想保持原始结构的第一帧。 – sikisis

+0

例如,我想要保留Base1 Base2记录的平均值和平均值。 – sikisis

+0

我怕我不明白你的问题。如果你愿意用一个可重现的小例子和预期的输出来更新你的问题,那么可能有人会发布一个更完整的解决方案。 –