【问题标题】:PANDAS efficient large dataframe iteration?PANDAS 高效的大数据框迭代?
【发布时间】:2014-11-29 01:23:31
【问题描述】:

我刚开始使用 Python,因为我是一位经验丰富的 R 用户,我发现 PANDAS 适合以下情况。我试图描述清楚,所以

情况是:

  • 带有列名和行名的大型数据框(用 0 填充)(尺寸 85558 x 85558)
  • 制表符分隔文件。

我的问题:

  • ¿如果成功比较(列名和行名)中包含的信息与解析文件的每一行中存在的标志,如何有效地迭代数据帧的每个单元格并填充计数?

我已经有一个函数可以比较行名/列名与标志。因此,假设一旦实现了对每个单元格的有效访问,就调用函数(例如 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

我试图不重复已经回答的问题,我认为这具有特殊性,即一个大型数据框,必须仔细考虑有关行名和列名的信息。

感谢所有可以将知识添加到答案中的人!

最好的!

---------- 编辑 --------

作为补充说明,因为这里的 cmets 建议的是我的典型输入和所需的输出:

输入由一系列由线条分隔的分组坐标组成。每一行都必须彼此分开处理:

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 中看到的,有一堆坐标作为行名和列名。然后,目标是从大数据框中的文件映射线分组坐标。例如如下坐标:

id1 chr6    1   chr6    100

只应计入 cell[1,1],因为 start-1 和 start-2 介于 0-2000 之间。但是,下一个坐标:

id2 chr6    1995    chr6    2200

只应计入 cell[1,2],因为 start-1 在 0-2000 之间 BUT start-2 在 2000-4000 之间。

最终输出将是在数据框中映射的分组坐标的矩阵:

    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 的组合来解决问题。我主要担心的是使用尽可能短的时间进行迭代和计数

这是否说明了情况? 谢谢!

【问题讨论】:

  • 您能否添加输入(DataFrame + 文件)和所需输出的简单示例?一些小的东西,比如 5x6 DataFrame,只是为了了解你想要做什么

标签: python pandas dataframe


【解决方案1】:

我有点困惑为什么你有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

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 2019-01-14
    • 2016-08-21
    • 2017-01-04
    • 1970-01-01
    • 2013-09-17
    • 2022-07-20
    • 2023-01-14
    • 2020-07-09
    相关资源
    最近更新 更多