我是熊貓新手。所以我想知道是否有更好的方法來完成這項任務。如何使用熊貓來阻止10幀長度的平均數據幀?
我有如下所示格式的數據幀:
這是從分子動力學的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
,結果是這樣的事情,這就是我想要的東西:
這裏是樣本輸出, 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)
,在這裏我想知道:
- 這個警告是否嚴重?
- 截止
groupby
Pandas
的功能,現在數據幀的索引是(Frame,Base1,Base2)
的組合,我怎樣才能像原始格式那樣分開它們。而是補充#Frame
至Block
索引。 - 我可以改進代碼嗎?還是使用更多熊貓的方式來完成這項任務?
最好!
假設你的數據框被稱爲'df',你可以這樣做:'df.groupby(DF [」 #Frame'] // 10).mean()'。另外,您應該重命名'#Frame'列爲「Frame」。 – Abdou
@Abdou,Thx,我已經更新了描述。現在有一些新的問題。 – sikisis