当前位置: 首页 > 面试题库 >

如何有效地迭代熊猫数据帧的连续块

曾洲
2023-03-14
问题内容

我有一个大的数据框(几百万行)。

我希望能够对它进行分组操作,而只是按行的任意连续(最好大小相等)的子集进行分组,而不是使用各个行的任何特定属性来确定它们要进入的组。

用例:我想通过IPython中的并行映射将函数应用于每一行。哪行进入哪个后端引擎都没有关系,因为该函数一次基于一行来计算结果。(至少在概念上;实际上是矢量化的。)

我想出了这样的东西:

# Generate a number from 0-9 for each row, indicating which tenth of the DF it belongs to
max_idx = dataframe.index.max()
tenths = ((10 * dataframe.index) / (1 + max_idx)).astype(np.uint32)

# Use this value to perform a groupby, yielding 10 consecutive chunks
groups = [g[1] for g in dataframe.groupby(tenths)]

# Process chunks in parallel
results = dview.map_sync(my_function, groups)

但这似乎很漫长,并且不能保证大小相等的块。尤其是当索引是稀疏的或非整数的或诸如此类的时候。

有什么更好的建议吗?

谢谢!


问题答案:

实际上,您不能 保证
大小相等的块。行数(N)可能是素数,在这种情况下,您只能获得大小相等的1或N块。因此,实际分块通常使用固定大小,并允许最后使用较小的块。我倾向于将数组传递给groupby。从…开始:

>>> df = pd.DataFrame(np.random.rand(15, 5), index=[0]*15)
>>> df[0] = range(15)
>>> df
    0         1         2         3         4
0   0  0.746300  0.346277  0.220362  0.172680
0   1  0.657324  0.687169  0.384196  0.214118
0   2  0.016062  0.858784  0.236364  0.963389
[...]
0  13  0.510273  0.051608  0.230402  0.756921
0  14  0.950544  0.576539  0.642602  0.907850

[15 rows x 5 columns]

我故意通过将索引设置为0来使索引无意义,我们只需确定大小(此处为10),然后按整数除以一个数组即可:

>>> df.groupby(np.arange(len(df))//10)
<pandas.core.groupby.DataFrameGroupBy object at 0xb208492c>
>>> for k,g in df.groupby(np.arange(len(df))//10):
...     print(k,g)
...     
0    0         1         2         3         4
0  0  0.746300  0.346277  0.220362  0.172680
0  1  0.657324  0.687169  0.384196  0.214118
0  2  0.016062  0.858784  0.236364  0.963389
[...]
0  8  0.241049  0.246149  0.241935  0.563428
0  9  0.493819  0.918858  0.193236  0.266257

[10 rows x 5 columns]
1     0         1         2         3         4
0  10  0.037693  0.370789  0.369117  0.401041
0  11  0.721843  0.862295  0.671733  0.605006
[...]
0  14  0.950544  0.576539  0.642602  0.907850

[5 rows x 5 columns]

当索引与索引不兼容时,基于​​切片DataFrame的方法可能会失败,尽管您始终.iloc[a:b]可以忽略索引值并按位置访问数据。



 类似资料:
  • 假设熊猫数据帧如下所示: 如何将第三行(如row3)提取为pd数据帧?换句话说,row3.shape应该是(1,5),row3.head()应该是:

  • 我有一个类似下面的DataFrame:,我想添加一个Streak列到它(见下面的例子): DataFrame大约200k行,从2005年到2020年。 现在,我要做的是在数据框的日期列中找到主队在该日期之前连续赢得的比赛数。我有一个解决方案,但速度太慢,请参见以下内容: 我怎样才能加快速度?

  • 我有一个大约300000行的熊猫数据帧a。每行都有一个纬度和经度值。 我还有一个大约10000行的第二个数据帧B,它有一个ID号,一个最大和最小纬度,以及一个最大和最小经度。 对于A中的每一行,我需要B中对应行的ID,以便A中行的纬度和经度包含在B中行表示的边界框中。 到目前为止,我有以下几点: 创建ID_列表变量的目的是将其作为ID列添加到A中。包含大于或等于以及小于条件,以便A中的每一行只有一

  • 我有一个数据框架,myDF,其中一列我希望使用来自其他列的条件和索引与第二个数据框架,标准DF的组合设置为零。 myDF.head(): 标准DF: 然后通过以下for循环运行myDF: 这会产生以下错误: 回溯(最近一次调用): 文件 “”, 第 1 行, in runfile('myscript.py', wdir='C:myscript') 文件“C:\ program data \ ana

  • 我有一个csv文件列表,我使用 我目前正在尝试遍历csv列表,并使用方法将axis参数设置为1,以按列将所有数据帧添加到一起。 它是工作的希望,但我遇到的问题,因为所有的数据帧都有相同的冒号名称,当我连接他们我得到例如10列都与关键"日期" 不管怎样,我能给哥伦布起个独一无二的名字吗?比如伦敦约会,柏林约会?显然,这些名称基于数据帧的名称。

  • 问题内容: 在您希望POS标记存储在熊猫数据框中的一列文本(每行只有一句话)的情况下,SO上的大多数实现都使用apply方法 NLTK文档建议使用pos_tag_sents()有效标记多个句子。 这是否适用于此示例,如果是,那么代码是否像更改为那样简单,或者NLTK意味着段落的文本源 正如评论中提到的那样,目的是每次都减少感受器的负载, 但是问题是如何做到这一点,并且仍然在熊猫数据框中生成一列?