Python groupby、transform和NaNs的奇怪结果

Python groupby、transform和NaNs的奇怪结果,python,numpy,pandas,Python,Numpy,Pandas,编辑(2015年5月19日):我刚刚验证,从版本0.16.1开始,这已被修复,因此在最新版本中,这应该不是问题 这些结果应该是一样的,对吧 df.groupby(level=0).transform('mean') df.groupby(level=0)['x'].transform(np.nanmean) df.groupby(level=0)['x'].transform('mean') 前两个可以,但第三个不行。可能是个虫子 df = pd.DataFrame({ 'x':[1,np.n

编辑(2015年5月19日):我刚刚验证,从版本0.16.1开始,这已被修复,因此在最新版本中,这应该不是问题

这些结果应该是一样的,对吧

df.groupby(level=0).transform('mean')
df.groupby(level=0)['x'].transform(np.nanmean)
df.groupby(level=0)['x'].transform('mean')
前两个可以,但第三个不行。可能是个虫子

df = pd.DataFrame({ 'x':[1,np.nan,3,4] }, index=[1,1,2,2],)

df
Out[686]: 
    x
1   1
1 NaN
2   3
2   4

df.groupby(level=0).transform('mean')
Out[687]: 
     x
1  1.0
1  1.0
2  3.5
2  3.5

df.groupby(level=0)['x'].transform(np.nanmean)
Out[688]: 
1    1.0
1    1.0
2    3.5
2    3.5
Name: x, dtype: float64
这很好,但不是这个:

df.groupby(level=0)['x'].transform('mean')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-691-24761ee742fd> in <module>()
----> 1 df.groupby(level=0)['x'].transform('mean')

C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\core\groupby.pyc in transform(self, func, *args, **kwargs)
   2411         # if string function
   2412         if isinstance(func, compat.string_types):
-> 2413             return self._transform_fast(lambda : getattr(self, func)(*args, **kwargs))
   2414 
   2415         # do we have a cython function

C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\core\groupby.pyc in _transform_fast(self, func)
   2457         values = np.repeat(values, com._ensure_platform_int(counts))
   2458 
-> 2459         return self._set_result_index_ordered(Series(values))
   2460 
   2461     def filter(self, func, dropna=True, *args, **kwargs):

C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\core\groupby.pyc in _set_result_index_ordered(self, result)
    495             result = result.sort_index()
    496 
--> 497         result.index = self.obj.index
    498         return result
    499 

C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\core\generic.pyc in __setattr__(self, name, value)
   1978         try:
   1979             object.__getattribute__(self, name)
-> 1980             return object.__setattr__(self, name, value)
   1981         except AttributeError:
   1982             pass

C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\lib.pyd in pandas.lib.AxisProperty.__set__ (pandas\lib.c:38795)()

C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\core\series.pyc in _set_axis(self, axis, labels, fastpath)
    266         object.__setattr__(self, '_index', labels)
    267         if not fastpath:
--> 268             self._data.set_axis(axis, labels)
    269 
    270     def _set_subtyp(self, is_all_dates):

C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\core\internals.pyc in set_axis(self, axis, new_labels)
   2209         if new_len != old_len:
   2210             raise ValueError('Length mismatch: Expected axis has %d elements, '
-> 2211                              'new values have %d elements' % (old_len, new_len))
   2212 
   2213         self.axes[axis] = new_labels

ValueError: Length mismatch: Expected axis has 3 elements, new values have 4 elements
df.groupby(level=0)['x'].transform('mean'))
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1 df.groupby(level=0)['x'].transform('mean'))
转换中的C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site packages\pandas\core\groupby.pyc(self、func、*args、**kwargs)
2411#if字符串函数
2412如果isinstance(函数、兼容字符串类型):
->2413返回self.\u transform\u fast(lambda:getattr(self,func)(*args,**kwargs))
2414
我们有cython函数吗
C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site packages\pandas\core\groupby.pyc in\u transform\u fast(self,func)
2457个值=np.重复(值、com.\u确保\u平台\u int(计数))
2458
->2459返回自。\设置\结果\索引\排序(系列(值))
2460
2461 def过滤器(self、func、dropna=True、*args、**kwargs):
C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site packages\pandas\core\groupby.pyc,按顺序排列(self,result)
495 result=result.sort_index()
496
-->497 result.index=self.obj.index
498返回结果
499
C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site packages\pandas\core\generic.pyc in\uuuuuuuu setattr\uuuuu(self、name、value)
1978尝试:
1979对象。获取属性(自我,名称)
->1980返回对象。\uuuu setattr\uuuuu(self、name、value)
1981除属性错误外:
1982年通行证
C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site packages\pandas\lib.pyd in pandas.lib.AxisProperty.\uuuuu集(pandas\lib.C:38795)()
C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site packages\pandas\core\series.pyc in\u set\u axis(self、axis、labels、fastpath)
266对象。uuuu setattr_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
267如果不是快速路径:
-->268自身数据。设置轴(轴、标签)
269
270定义集子类型(自身,是所有日期):
C:\Users\eilerj\AppData\Local\Continuum\Anaconda\lib\site packages\pandas\core\internals.pyc在set\u axis中(self、axis、new\u标签)
2209如果新的话!=奥德伦:
2210提升值错误('长度不匹配:预期轴有%d个元素,'
->2211'新值有%d个元素“%”(旧元素,新元素))
2212
2213自身轴[轴]=新的_标签
ValueError:长度不匹配:预期轴有3个元素,新值有4个元素

我已经验证了在版本0.16.1中确实已经修复了这一问题。请参阅上面@DSM和@AndyHayden的评论。

我认为这是一个bug,我应该修复它。您能和大熊猫行李箱确认一下吗?@DSM对不起,我不知道如何检查大熊猫行李箱。这是最新的pandas(16.0)版本,但看起来您可能几天前才修复了它。我暂时不讨论这个问题,但是如果我要删除这个问题,请让我知道。我投票将这个问题作为主题外的问题来结束,因为这是一个错误报告,最好作为Github问题来解决(尽管这个问题已经解决了!):)@安迪·海登:我不知道是关闭还是删除更好,但如果有帮助的话,我很乐意删除。让我知道。@JohnE没问题,我是“投票决定”的,所以需要5个人同意,然后它才会存在,但有点像是贴上了“没有答案”的标签。不要删除它-保留您的投票!