如何使用Pandas来阻止长度为10帧的平均数据帧?

时间:2017-06-12 15:56:05

标签: python python-3.x pandas pandas-groupby

我是熊猫新手。所以我想知道是否有更好的方法来完成这项任务。

我有一个类似以下格式的数据框:

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。

虽然,我认为通过仔细分配每行的索引我可以完成这些任务,我想知道是否有一些方便的方法来完成这个任务。我已经检查了一些关于groupbypandas函数的网页,看起来似乎没有这个组每10行获得一个块平均函数。

谢谢!

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

很抱歉没有明确我的目的描述,我已经找到了一种方法来完成任务和示例输出,以更好地说明我的目的。

对于双链DNA,我们知道它是AGCT的双螺旋结构,因此Base1表示DNA的一个碱基,Base2表示另一个链的互补碱基。两个相应的碱基通过氢键连接在一起。

像:

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

所以在BPdata.csv这里,Base1和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:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

     

请参阅文档中的警告:   http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy   GPtemp [&#39; Frame&#39;] = str(i)/home/iphyer/Downloads/dataProcessing.py:62:   SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

     

请参阅文档中的警告:   http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy   GPtemp [&#39; Frame&#39;] = str(i)

我想知道:

  1. 这个警告严重吗?
  2. groupby的{​​{1}}函数,现在数据框的索引是Pandas的组合,如何将它们分开,就像原始表单一样。而是将(Frame,Base1,Base2)补充到#Frame索引。
  3. 我可以改进代码或使用更多Pandas方式来完成这项任务吗?
  4. 最佳!

1 个答案:

答案 0 :(得分: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