Pandas:DataFrame.sum()或DataFrame()。as_matrix.sum()

3

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

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

Vs.

选项#2:[在循环索引1和索引2以获取所有组合时]

唯一的区别是,在循环之前,将数据矩阵导出为np.array而不是使用DataFrame。

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

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

问题:

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

我建议您将函数移植到Cython而不是纯Python。 - Wes McKinney
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()方法来访问标量,类似于矩阵查找。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接