【问题标题】:how to make pandas dataframe Fortran type ordered如何使熊猫数据框 Fortran 类型有序
【发布时间】:2018-08-31 09:29:55
【问题描述】:

我知道一点,在 python pandas 包中,数据框有一部分是用 NumPy NDArrays 构建的。并且 numpy 可以选择数据顺序类型,例如“C”或“F”。

由于我总是要在庞大的数据帧(如 1 亿行)上的列上实现大量操作,我希望如果我有机会将数据帧从 c 类型转换为 f 类型,我可以大大提高性能,对吧?

如果是这样,我该怎么做?或者简单地使用 numpy,因为 pandas 数据框不是必须的,实际上是一个快速的答案。

谢谢

【问题讨论】:

  • 我不相信 Pandas 能做到这一点,抱歉。
  • numpy 根据数组维度 进行操作不同,pandas 使用 tables。这种方法本质上是不对称的。

标签: python performance pandas numpy


【解决方案1】:

有趣的是,Pandas 对每一列都使用了内部 C 顺序 numpy 数组。每当您访问多个列或所有数据框时,它都会连接这些 numpy 数组并返回一个 Fortran 顺序 numpy 数组。

print(df[df.columns[0]].values.flags)
print(df[df.columns[0:2]].values.flags)
print(df.values.flags)

#Single column
C_CONTIGUOUS : True
F_CONTIGUOUS : True

#Multiple columns
C_CONTIGUOUS : False
F_CONTIGUOUS : True

#Entire dataframe
C_CONTIGUOUS : False
F_CONTIGUOUS : True

因此,列操作非常快(添加/编辑/删除等)。这就是为什么在数据帧中迭代行很慢。 如果您的程序有更多的行操作,请将其转换为 C 顺序,如下所示。

df = pd.DataFrame(np.ascontiguousarray(df.values), columns=df.columns)

每当我完成按列处理时,我会将其转换为 C 连续数组,因为缩放、批量训练 DNN 在 C 顺序数组中要快得多。

【讨论】:

  • 我喜欢这个答案,但是我不清楚一件事。如果我们谈论的是数据框的单列,那么谈论顺序是否有意义?如果数组是一维数组,则只有一种可能的顺序,即 C 顺序和 F 顺序在此设置中始终相同。
  • 没错。对于 1 列,C 顺序和 F 顺序都是连续的。上面代码中的第一行显示了这一点。所以,单列没有问题。仅对于多列,转换为 C 顺序连续以加速缩放和 DNN 训练是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 2021-06-02
  • 2020-04-09
  • 1970-01-01
  • 2018-07-05
  • 2018-03-17
相关资源
最近更新 更多