我正在尝试将两个熊猫系列加在一起。第一个系列非常大,并且有一个 MultiIndex。第二个系列的索引是第一个索引的一个小子集。
df1 = pd.DataFrame(np.ones((1000,5000)),dtype=int).stack()
df1 = pd.DataFrame(df1, columns = ['total'])
df2 = pd.concat([df1.iloc[50:55],df1.iloc[2000:2005]]) # df2 is tiny subset of df1
第一次使用常规的 Series.add 函数大约需要 9 秒,后续尝试需要 2 秒(可能是因为 pandas 优化了 df 在内存中的存储方式?)。
starttime = time.time()
df1.total.add(df2.total,fill_value=0).sum()
print "Method 1 took %f seconds" % (time.time() - starttime)
手动迭代行的时间大约是第一次 Series.add 的 2/3,大约是 Series.add 后续尝试的 1/100。
starttime = time.time()
result = df1.total.copy()
for row_index, row in df2.iterrows():
result[row_index] += row
print "Method 2 took %f seconds" % (time.time() - starttime)
当(如此处)索引是 MultiIndex 时,速度差异特别明显。
为什么 Series.add 在这里不能很好地工作?有什么建议可以加快速度吗?是否有更有效的替代方案来迭代系列的每个元素?
另外,如何对数据框进行排序或结构化以提高这两种方法的性能?第二次运行这两种方法中的任何一种都明显更快。如何在第一时间获得这种性能?使用 sort_index 进行排序只能起到很小的作用。