【问题标题】:Pandas: DataFrame.sum() or DataFrame().as_matrix.sum()熊猫:DataFrame.sum() 或 DataFrame().as_matrix.sum()
【发布时间】:2013-01-28 15:28:38
【问题描述】:

我正在编写一个函数来计算 pd.DataFrame 中所有列的条件概率,该 pd.DataFrame 具有 ~800 列。我写了几个版本的函数,发现两个主要选项的计算时间有很大差异:

col_sums = data.sum()   #Simple Column Sum over 800 x 800 DataFrame

选项 #1: {'col_sums' 和 'data' 分别是 Series 和 DataFrame}

[这包含在 index1 和 index2 上的循环中以获取所有组合]

joint_occurance = data[index1] * data[index2]
sum_joint_occurance = joint_occurance.sum()
max_single_occurance = max(col_sum[index1], col_sum[index2])
cond_prob = sum_joint_occurance / max_single_occurance #Symmetric Conditional Prob
results[index1][index2] = cond_prob

对比。

选项#2: [同时遍历 index1 和 index2 以获取所有组合] 唯一的区别是我在循环之前将 data_matrix 导出到 np.array 而不是使用 DataFrame

new_data = data.T.as_matrix() [Type: np.array]

选项 #1 运行时间约为 1700 秒 选项 #2 运行时间约为 122 秒

问题:

  1. 将 DataFrames 的内容转换为 np.array 最适合计算任务吗?
  2. pandas 中的 .sum() 例程与 NumPy 中的 to .sum() 例程有显着不同,还是由于标签访问数据而导致速度差异?
  3. 为什么这些运行时如此不同?

【问题讨论】:

  • 我建议您将函数移植到 Cython 而不是纯 Python。

标签: python pandas


【解决方案1】:

在阅读我遇到的文档时:

第 7.1.1 节快速获取和设置标量值 因为使用 [] 进行索引必须处理很多情况(单标签访问、切片、 布尔索引等),它有一些开销以便计算 出你的要求。如果您只想访问标量值, 最快的方法是使用get_value方法,实现 在所有数据结构上:

In [656]: s.get_value(dates[5])
Out[656]: -0.67368970808837059
In [657]: df.get_value(dates[5], ’A’)
Out[657]: -0.67368970808837059

最佳猜测: 因为我从数据框中多次访问单个数据元素(每个矩阵约 640,000 个)。我认为速度降低来自我引用数据的方式(即“使用 [] 进行索引处理很多情况”),因此我应该使用 get_value() 方法来访问类似于矩阵查找的标量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2018-07-04
    • 2018-08-13
    • 1970-01-01
    • 2013-03-24
    • 2019-04-27
    • 2014-11-23
    相关资源
    最近更新 更多