Pandas:DataFrame.sum()还是DataFrame().as_matrix.sum()

3 投票
1 回答
6654 浏览
提问于 2025-04-17 15:42

我正在写一个函数,用来计算一个大约有800列的pd.DataFrame中所有列的条件概率。我写了几个版本的这个函数,发现两种主要选项在计算时间上差别很大:

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

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

[这个是在一个循环中进行的,循环的目的是获取所有的组合]

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: [在循环中获取所有组合时] 唯一的不同是,在循环之前我把data_matrix导出成了一个np.array,而不是使用DataFrame

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

选项 #1的运行时间大约是1700秒

选项 #2的运行时间大约是122秒

问题:

  1. 把DataFrame的内容转换成np.array对于计算任务来说是最优的吗?
  2. 在pandas中,.sum()这个函数和NumPy中的.sum()有显著区别吗?还是说速度差异是因为访问数据时的标签问题?
  3. 为什么这两个选项的运行时间差别这么大?

1 个回答

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()方法来访问标量值,就像查找矩阵一样。

撰写回答