复制或分组数据帧时如何保持主顺序?

2024-06-02 03:48:48 发布

您现在位置:Python中文网/ 问答频道 /正文

如何按顺序使用或操纵(monkey patch)pandas,以便在copy和groupby聚合的结果对象上始终保持相同的主顺序?

我使用pandas.DataFrame作为业务应用程序(风险模型)中的数据结构,需要快速聚合多维数据。使用pandas进行聚合在很大程度上取决于底层numpy数组上使用的主要排序方案

不幸的是,pandas(版本0.23.4)在创建副本或使用groupby和sum执行聚合时更改了基础numpy数组的主要顺序

其影响是:

案例1:17.2秒

情况2:5分46秒

在数据帧及其副本上,包含45023行和100000列。对索引执行聚合。索引是一个有15个级别的pd.MultiIndex。聚合保持三个水平,并导致约239组

我通常处理45000行和100000列的数据帧。在这一行,我有一个pandas.MultiIndex,大约有15个级别。要计算各种层次结构节点的统计信息,我需要在索引维度上进行聚合(求和)

如果底层numpy数组是c_contiguous,则聚合速度很快,因此按列主顺序(C顺序)进行。如果它是f_contiguous,那么它是非常慢的,因此是按行的主要顺序(F顺序)

不幸的是,pandas在

  • 创建数据帧的拷贝

  • 通过grouby执行聚合并对石斑鱼求和。因此,生成的数据帧具有不同的主次(!)

当然,我可以坚持另一个“数据模型”,只要在列上保留多索引。那么现在的熊猫版本总是对我有利的。但这是不可能的。我认为,人们可以预期,对于正在考虑的两个操作(groupby sum和copy),主要顺序不应该改变

import numpy as np
import pandas as pd

print("pandas version: ", pd.__version__)

array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
array.flags
print("Numpy array is C-contiguous: ", data.flags.c_contiguous)

dataframe = pd.DataFrame(array, index = pd.MultiIndex.from_tuples([('A', 'U'), ('A', 'V'), ('B', 'W')], names=['dim_one', 'dim_two']))
print("DataFrame is C-contiguous: ", dataframe.values.flags.c_contiguous)

dataframe_copy = dataframe.copy()
print("Copy of DataFrame is C-contiguous: ", dataframe_copy.values.flags.c_contiguous)

aggregated_dataframe = dataframe.groupby('dim_one').sum()
print("Aggregated DataFrame is C-contiguous: ", aggregated_dataframe.values.flags.c_contiguous)


## Output in Jupyter Notebook
# pandas version:  0.23.4
# Numpy array is C-contiguous:  True
# DataFrame is C-contiguous:  True
# Copy of DataFrame is C-contiguous:  False
# Aggregated DataFrame is C-contiguous:  False

应保留数据的主要顺序。如果熊猫喜欢切换到一个隐含的偏好,那么它应该允许覆盖它。Numpy允许在创建副本时输入顺序

一个修补版的熊猫应该会导致

## Output in Jupyter Notebook
# pandas version:  0.23.4
# Numpy array is C-contiguous:  True
# DataFrame is C-contiguous:  True
# Copy of DataFrame is C-contiguous:  True
# Aggregated DataFrame is C-contiguous:  True

对于上面截取的示例代码


Tags: 数据numpytruedataframepandas顺序isarray