我是熊猫新手。所以我想知道是否有更好的方法来完成这项任务。
我有一个类似以下格式的数据框:
这是来自分子动力学的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。
虽然,我认为通过仔细分配每行的索引我可以完成这些任务,我想知道是否有一些方便的方法来完成这个任务。我已经检查了一些关于groupby
中pandas
函数的网页,看起来似乎没有这个组每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
结果是这样的,这就是我想要的:
以下是示例输出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)
我想知道:
groupby
的{{1}}函数,现在数据框的索引是Pandas
的组合,如何将它们分开,就像原始表单一样。而是将(Frame,Base1,Base2)
补充到#Frame
索引。最佳!
答案 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