我刚开始使用Python,因为我是一位经验丰富的R用户,我发现PANDAS适合以下情况。我试着清楚地描述它,所以
情况是:
- 带有colnames和rownames的大型数据框(用0填充)(尺寸85558 x 85558)
- 制表符分隔文件。
我的问题:
- ¿如何有效地迭代数据帧的每个单元格,如果在(colnames和rownames)中包含的信息与解析文件的每一行中出现的标志之间实现了成功的比较,那么填写计数?
我已经有了一个比较rownames / colnames vs flags的函数。因此,假设一旦实现对每个单元的有效访问,则调用函数(i.ex。 compare_and_count()),将colnames和rownames解析为参数,并返回计数。逻辑上,计数将被添加到数据框单元格中,如果存在先前的计数,则将其相加。
正如此处的附加信息是数据框的预览:
chr6:0-2000 chr6:2000-4000 chr6:4000-6000 chr6:6000-8000 ... chr6:171114000-171115067
chr6:0-2000 0 0 0 0 ... 0
chr6:2000-4000 0 0 0 0 ... 0
chr6:4000-6000 0 0 0 0 ... 0
… … … … … …
chr6:171110000-171112000 0 0 0 0 ... 0
chr6:171112000-171114000 0 0 0 0 ... 0
chr6:171114000-171115067 0 0 0 0 ... 0
我试图不重新考虑已回答的问题,我认为这是一个大型数据框的特殊情况,必须仔细考虑有关rownames和colnames的信息。
我感谢所有能够将其知识添加到答案中的人!
最佳!
------------- 编辑 --------------------
作为补充说明,因为这里的评论建议是我的典型输入和所需的输出:
输入由一系列由线分隔的分组坐标组成。每条线必须彼此分开处理:
Ids CHR-1 START-1 CHR-2 START-2
id1 chr6 1 chr6 100
id2 chr6 1995 chr6 2200
id3 chr6 2300 chr6 2500
id4 chr6 3300 chr6 3500
id5 chr6 3447 chr6 3658
id6 chr6 5000 chr6 5100
id7 chr6 5050 chr6 5150
id8 chr6 6000 chr6 6100
正如您在第一个Dataframe中看到的那样,有一些坐标作为rownames和colnames。那么,目标是在大数据帧中映射文件中的行分组坐标。例如,以下坐标:
id1 chr6 1 chr6 100
只应计入 cell [1,1] ,因为start-1和start-2介于0-2000之间。但是,下一个坐标是:
id2 chr6 1995 chr6 2200
只应计入单元格[1,2] ,因为start-1介于0-2000 BUT start-2介于2000-4000之间。< / p>
最终输出将是在数据框中映射分组坐标的矩阵:
chr6:0-2000 chr6:2000-4000 chr6:4000-6000 chr6:6000-8000 ... chr6:171114000-171115067
chr6:0-2000 1 2 0 0 ... 0
chr6:2000-4000 0 1 0 0 ... 0
chr6:4000-6000 0 0 1 0 ... 0
… … … … … …
chr6:171110000-171112000 0 0 0 0 ... 0
chr6:171112000-171114000 0 0 0 0 ... 0
chr6:171114000-171115067 0 0 0 0 ... 0
正如您可以表示的那样,对于此示例,我没有考虑同一行中是否存在不同的ID,因此可以使用if / else语句与稍微不同的Dataframe的组合来解决这些问题。我主要担心的是迭代&amp;使用最短的时间来计算。
这是否澄清了这种情况? 谢谢!
答案 0 :(得分:0)
我对你为什么有CHR-1
和CHR-2
列感到有点困惑,他们似乎没有添加任何内容。这是我的示例DataFrame
:
df = pandas.DataFrame([[500, 200], [600,1100], [500, 2200]], columns=['a','b'])
>>> df
a b
0 500 200
1 600 1100
2 500 2200
您希望以2000的倍数对元素进行分区:
df /= 2000
>>> df
a b
0 0 0
1 0 0
2 0 1
现在我们可以看到cell[0,0]
应该有2个计数,cell[0,1]
应该有1个计数。我们使用groupby
方法完成此操作,并使用count
作为我们的聚合器:
c = df.groupby(['a','b']).size()
>>> c
a b
0 0 2
1 1
现在我们可以通过以下方式获取单元格的计数:
>>> c.loc[0,0]
2
>>> c.loc[0,1]
1