我是熊猫新手。所以我想知道是否有更好的方法来完成这项任务。如何使用熊猫来阻止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