这段代码有效——它将每列设置为其平均值:
def setSerNanToMean(serAll):
return serAll.replace(np.NaN, serAll.mean())
def setPdfNanToMean(pdfAll, listCols):
pdfAll.ix[:,listCols] = pdfAll.ix[:,listCols].apply(setSerNanToMean)
setPdfNanToMean(pdfAll, [1,2,3,4])
此代码不起作用:
^{pr2}$为什么第二块代码不起作用?不数据帧应用()默认为就地?apply函数没有就地参数。如果它不能正常工作,这不是让熊猫成为一个糟糕的记忆处理者吗?在这种情况下,所有的pandas数据帧操作都会复制所有内容吗?就这样不好吗?即使它没有默认为inplace,它不应该像replace()那样提供一个inplace参数吗?在
我不是在寻找具体的答案,而是一般性的理解。同样,其中的一个代码块可以工作,所以我可以继续前进,但我真正想做的是理解pandas如何处理内存对象的操作。我有麦金尼的书,所以页面引用非常欢迎,所以你不必输入太多。在
不,应用不适用*。在
这里还有另一个例子:inplace标志并不意味着任何函数实际上在原地发生(!)。举个例子:
注意:通常,如果类型相同,那么values数组也是相同的,但是pandas不能保证这一点。
一般来说,apply很慢(因为您基本上是在python中迭代每一行),而“游戏”是根据pandas/numpy本机函数和索引重写该函数。如果您想深入了解内部的更多细节,请查看core中的BlockManager/内件.py,这是保存底层numpy数组的对象。但老实说,我认为您最有用的工具是
%timeit
,并查看特定函数的源代码(ipython中的??
)。在在这个特定的示例中,我考虑在所需列的显式for循环中使用fillna:
^{pr2}$(也许对于fillna来说,为这个用例使用columns参数是有意义的?)在
所有这些并不是说熊猫记忆力低下。。。但有时必须考虑高效(和内存高效)的代码。在
*apply通常在本地没有意义(在我看来,这种行为很少被期望)。
相关问题 更多 >
编程相关推荐