Python 如何使用Pandas阻止长度为10帧的平均数据帧?
我对熊猫不熟悉。所以我想知道是否有更好的方法来完成这项任务 我有如下格式的数据框: 这是来自分子动力学的DNA模拟数据 数据集如下所示: 这里总共有1000帧,我的目的是得到每10帧的平均值,所以,最后,我希望数据如下:Python 如何使用Pandas阻止长度为10帧的平均数据帧?,python,python-3.x,pandas,pandas-groupby,Python,Python 3.x,Pandas,Pandas Groupby,我对熊猫不熟悉。所以我想知道是否有更好的方法来完成这项任务 我有如下格式的数据框: 这是来自分子动力学的DNA模拟数据 数据集如下所示: 这里总共有1000帧,我的目的是得到每10帧的平均值,所以,最后,我希望数据如下: Block Base1 Base2 Shear Stretch Stagger ..... 1 1 66 XX XX XX 1 2 65 XX XX XX ... ... ...
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
by中groupby
函数的网页,似乎没有将该组每10行设置一个块平均值函数
谢谢大家!
===================================================================================================================
很抱歉,我没有明确说明我的目的,我已经找到了完成任务的方法,并提供了一个示例输出,以更好地说明我的目的
对于双链DNA,我们知道它是带有AGCT的双螺旋结构,因此Base1表示DNA的一个碱基,Base2表示另一条链的互补碱基。两个相应的碱基通过氢键连接在一起
比如:
所以这里在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
#-*-编码:utf-8-*-
作为pd进口熊猫
'''
数据输入
'''
#将CSV数据导入Python
BPdata=pd.read\u csv(“BPdata.csv”,delim\u空格=True,skip\u空白行=False)
重命名(列={'#Frame':'Frame'},inplace=True)
'''
数据处理
'''
#常数块平均参数
间隔20ns=10
IntervalInBPdata=34
#BPdataBlockAverageSummary
LEN_BPdata=LEN(BPdata)
#第1帧
i=1
索引开始=0
指数化=0
索引开始=索引结束
indexEnding=间隔20ns*间隔pData*i-1
GPtemp=BPdata.loc[索引开始:索引结束]
GPtemp['Frame']=str(i)
BPdata_blockOF1K_mean=GPtemp.groupby(['Frame','Base1','Base2']).mean()
BPdata_blockOF1K_mean.loc[len(BPdata_blockOF1K_mean)]=str(i)
#对于第2帧,依此类推
i=i+1
索引开始=索引结束+1
indexEnding=间隔20ns*间隔pData*i-1
而熊猫中的while(indexEnding分组有多种方法。其中一种方法是传递一个序列。因此,可以传递一个具有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
熊猫分组有多种方式。其中一种方式是传递一个序列。因此,可以传递一个具有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
假设您的数据帧被称为df
,您可以执行:df.groupby(df['#Frame']//10).mean()
。此外,您可能应该将列#Frame
重命名为justFrame
@Abdou,Thx,我已经更新了描述。现在出现了一些新问题。假设您的数据帧名为df
,您可以执行:df.groupby(df['#Frame']//10.mean()
。另外,您可能应该将列#Frame
重命名为justFrame
@Abdou,Thx,我已经更新了描述。现在出现了一些新问题。嗨,@Woody Pride,我尝试了您的解决方案,但结果如下:`Frame Base1 Base2剪切拉伸交错扣\0 485。80315316.995941 50.004059 0.017325-0.042114 0.067136 1.731197`但我想保持第一帧的原始结构。例如,我不仅要保持Base1 Base2记录的平均值,还要保持Base2记录的每个平均值。恐怕我不理解你的问题。如果你想用一个小的可复制的ex更新你的问题充足且预期的输出,然后可能有人会发布更完整的解决方案。嗨,@Woody Pride,我尝试过你的解决方案,但结果如下:“#Frame Base1 Base2剪切拉伸交错扣\0 485.80315316.995941 50.004059 0.017325-0.042114 0.067136 1.731197`但我想保持o第一帧的原始结构。例如,我不仅要保留Base1 Base2记录的平均值,还要保留每个平均值。恐怕我不理解你的问题。如果你想用一个小的可复制示例和预期输出更新你的问题,那么也许有人会发布一个更完整的解决方案。