Pandas数据帧行为

2024-09-27 23:15:32 发布

您现在位置:Python中文网/ 问答频道 /正文

这段代码有效——它将每列设置为其平均值:

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如何处理内存对象的操作。我有麦金尼的书,所以页面引用非常欢迎,所以你不必输入太多。在


Tags: 数据代码pandas参数defreplace平均值ix
1条回答
网友
1楼 · 发布于 2024-09-27 23:15:32

不,应用不适用*。在

这里还有另一个例子:inplace标志并不意味着任何函数实际上在原地发生(!)。举个例子:

In [11]: s = pd.Series([1, 2, np.nan, 4])

In [12]: s._data._values
Out[12]: array([  1.,   2.,  nan,   4.])

In [13]: vals = s._data._values

In [14]: s.fillna(s.mean(), inplace=True)

In [15]: vals is s._data._values  # values are the same
Out[15]: True

In [16]: vals
Out[16]: array([ 1.        ,  2.        ,  2.33333333,  4.        ])

In [21]: s = pd.Series([1, 2, np.nan, 4])  # start again

In [22]: vals = s._data._values

In [23]: s.fillna('mean', inplace=True)

In [24]: vals is s._data._values  # values are *not* the same
Out[24]: False

In [25]: s._data._values
Out[25]: array([1.0, 2.0, 'mean', 4.0], dtype=object)

注意:通常,如果类型相同,那么values数组也是相同的,但是pandas不能保证这一点。

一般来说,apply很慢(因为您基本上是在python中迭代每一行),而“游戏”是根据pandas/numpy本机函数和索引重写该函数。如果您想深入了解内部的更多细节,请查看core中的BlockManager/内件.py,这是保存底层numpy数组的对象。但老实说,我认为您最有用的工具是%timeit,并查看特定函数的源代码(ipython中的??)。在

在这个特定的示例中,我考虑在所需列的显式for循环中使用fillna:

^{pr2}$

(也许对于fillna来说,为这个用例使用columns参数是有意义的?)在

所有这些并不是说熊猫记忆力低下。。。但有时必须考虑高效(和内存高效)的代码。在

*apply通常在本地没有意义(在我看来,这种行为很少被期望)。

相关问题 更多 >

    热门问题