2017-06-12 57 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

我怕我不明白你的問題。如果你願意用一個可重現的小例子和預期的輸出來更新你的問題,那麼可能有人會發佈一個更完整的解決方案。 –