我一直在对系列和数据框使用pandas apply方法,但是显然我仍然缺少一些东西,因为我迷上了一个我试图执行的简单函数。

这是我在做什么:

def minmax(row):
    return (row - row.min())/(row.max() - row.min())

row.apply(minmax)


但是,这将返回全零系列。例如,如果

row = pd.Series([0, 1, 2])


然后

minmax(row)


根据需要返回[0.0,0.5,1.0]。但是,row.apply(minmax)返回[0,0,0]。

我认为这是因为该系列是整数,并且整数除法返回0。但是,我不明白,


为什么它可以与minmax(row)一起使用(它的作用不一样吗?),以及
如何在apply函数中正确地强制转换以返回适当的浮点值(我尝试使用.astype强制转换,这给了我所有的NaN ...我也不理解)
如果将此值应用于数据帧,则作为df.apply(minmax)也会按需工作。 (已添加编辑)


我怀疑我在应用程序的工作方式上缺少了一些基本知识...或过于密集。无论哪种方式,在此先感谢。

最佳答案

row.apply(minmax)上调用Series时,仅将值传递给该函数。这被称为元素明智的。


  在Series值上调用函数。可以是ufunc(适用于整个Series的NumPy函数)或仅适用于单个值的Python函数。


row.apply(minmax)上调用DataFrame时,行(默认值)或列都将传递给函数(根据axis的值)。


  传递给函数的对象是具有数据框索引(axis = 0)或列(axis = 1)的Series对象。返回类型取决于传递的函数是否聚合,或者取决于DataFrame为空时的reduce参数。这称为按行或按列。


这就是为什么您的示例在DataFrame而不是Series上可以正常工作的原因。选中此answer以获取有关将功能映射到Series的信息。

09-25 18:27
查看更多