PANDAS高效的大型数据帧迭代?

时间:2014-11-28 12:47:19

标签: python pandas dataframe

我刚开始使用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;使用最短的时间来计算

这是否澄清了这种情况? 谢谢!

1 个答案:

答案 0 :(得分:0)

我对你为什么有CHR-1CHR-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