【发布时间】:2019-10-10 00:11:46
【问题描述】:
如何按顺序使用或操作(猴子补丁)pandas,以便在复制和 groupby 聚合的结果对象上始终保持相同的主要顺序?
我使用pandas.DataFrame 作为业务应用程序(风险模型)中的数据结构,需要快速聚合多维数据。与 pandas 的聚合主要取决于底层 numpy 数组上使用的主要排序方案。
不幸的是,当我创建副本或使用 groupby 和 sum 执行聚合时,pandas(版本 0.23.4)会更改底层 numpy 数组的主要顺序。
影响是:
案例 1:17.2 秒
案例 2:5 分 46 秒
在 DataFrame 及其具有 45023 行和 100000 列的副本上。对索引执行聚合。索引是pd.MultiIndex,有 15 个级别。聚合保持三个级别,并导致大约 239 个组。
我通常在具有 45000 行和 100000 列的 DataFrame 上工作。在这一行,我有一个 pandas.MultiIndex,大约有 15 个级别。要计算各种层次结构节点的统计信息,我需要在索引维度上聚合(总和)。
如果底层 numpy 数组是 c_contiguous,那么聚合速度很快,因此以列优先顺序(C 顺序)保持。如果是f_contiguous,则非常慢,因此是行主要顺序(F 顺序)。
不幸的是,pandas 将主要顺序从 C 更改为 F
创建一个DataFrame 的副本,甚至在什么时候,
通过 grouby 进行聚合,然后对 grouper 求和。因此,生成的 DataFrame 具有不同的主要顺序 (!)
当然,我可以坚持使用另一个“数据模型”,只需将 MultiIndex 保留在列上。那么当前的熊猫版本总是对我有利。但这是不行的。我认为,可以预期,对于正在考虑的两个操作(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
应保留数据的主要顺序。如果 pandas 喜欢切换到隐式偏好,那么它应该允许覆盖它。 Numpy 允许在创建副本时输入顺序。
pandas 的补丁版本应该会导致
## 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
上面截取的示例代码。
【问题讨论】:
标签: python pandas performance pandas-groupby column-major-order