Python 2.7 贬低功能不适用于groupby

Python 2.7 贬低功能不适用于groupby,python-2.7,pandas,Python 2.7,Pandas,我正试图根据韦斯·麦金尼(Wes McKinney)关于熊猫的书为我的公司编写培训材料,但我无法让一个贬低功能返回预期输出,这让我感到困惑 import pandas as pd import numpy as np #create some data people = DataFrame(np.random.RandomState(1000).randn(5, 5,), columns=['a', 'b', 'c', 'd', 'e'], \ index=['J

我正试图根据韦斯·麦金尼(Wes McKinney)关于熊猫的书为我的公司编写培训材料,但我无法让一个贬低功能返回预期输出,这让我感到困惑

import pandas as pd
import numpy as np

#create some data
people = DataFrame(np.random.RandomState(1000).randn(5, 5,), columns=['a', 'b', 'c', 'd', 'e'], \
               index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
# introduce some missing values
people.ix[2:3, ['b', 'c']] = NA

#Group data by passing a Dict
key = {'Jim': 'one', 'Joe' : 'two', 'Steve' : 'one', 'Travis' : 'two', 'Wes' : 'one'}
PGrouped = people.groupby(key)

#define demeaning function
def DeMean(x):
    return x - x.mean()

#Transform data
DeMeaned = PGrouped.transform(DeMean)

#Check that DeMeaned now has zero group means:
DeMeaned.groupby(key).mean()
我不知道如何在这里粘贴输出,但是作为np。种子是在数据创建中设定的,我相信你会得到同样的结果。这两个组中的所有列都应为0,但我在c列和e列中得到0,而在其余列中没有。你知道这里发生了什么吗

谢谢

编辑:我在函数中放入了一些print语句,并将len作为分组函数传递,以查看情况如何变化。我还删除了NA值。不走运。事实上,请有人解释一下:

def DoNothing(x):
    print x.name
    print type(x)
    return x

poeple.groupby(len).transform(DoNothing)
函数中的x.name打印语句在调用时生成以下输出:

a, a, b, c, d, e, 3, 5, 6, 
type(x)print语句表示a、a、b、c、d、e是系列对象,而3、5、6是数据帧对象

为什么呢?我认为transform将把每一列作为一个系列传递给transform函数。尽管奇怪的是“a”似乎被传递了两次(或者不仅仅是“a”被传递——我希望所有列都被传递三次,因为有三个组),但它似乎也传递具有组名的数据帧对象

有人能向我解释什么是真正传递给转换函数的吗


我很困惑

由于浮点精度的限制,你必须非常幸运地得到精确的零均值:DeMeaned.groupby(key.mean().abs().values.max()返回非常小的值,比如
1e-16
左右?如果是这样的话,那就和你所期望的一样接近于零了。我知道,实际上并不是那么小。全部
5.55e-17
。奇怪的是,在这个例子的教科书中,它的结果是完美的0。我认为这个练习向我展示的是,我不完全理解转换操作发生了什么。我原以为每一列数据都是作为一个系列传递的,但我的Edit中DoNothing函数中的print语句似乎表明情况并非如此?5.55e-17小于1e-16。基本上是零。我承认,我有点惊讶于这个例子竟然得到了完美的零,因为这不是一个
pandas
的东西。尝试
x=np.random.random(5);打印(x-x.mean()).mean()
几次,看看我的意思。另请参见中的示例,其结果很小但不为零。哈哈,哦,是的。好吧,所以我很惊讶。谢谢