Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫“agg”要上市;AttributeError/ValueError:函数不减少;_Python_Pandas_Group By_Pandas Groupby - Fatal编程技术网

Python 熊猫“agg”要上市;AttributeError/ValueError:函数不减少;

Python 熊猫“agg”要上市;AttributeError/ValueError:函数不减少;,python,pandas,group-by,pandas-groupby,Python,Pandas,Group By,Pandas Groupby,通常,当我们使用pandas执行groupby操作时,我们可能希望在多个系列中应用多个函数 似乎是执行这些分组和计算的自然方式 但是,groupby.agg和groupby.apply的实现方式似乎存在差异,因为我无法使用agg对列表进行分组。Tuple和set工作得很好,这对我来说意味着只能通过agg聚合到不可变类型。通过groupby.apply,我可以直接将一个系列聚合到一个列表中,而不会出现任何问题 下面是一个完整的例子。功能(1)、(2)、(3)成功完成。(4) 返回时带有#Value

通常,当我们使用pandas执行
groupby
操作时,我们可能希望在多个系列中应用多个函数

似乎是执行这些分组和计算的自然方式

但是,
groupby.agg
groupby.apply
的实现方式似乎存在差异,因为我无法使用
agg
对列表进行分组。Tuple和set工作得很好,这对我来说意味着只能通过
agg
聚合到不可变类型。通过
groupby.apply
,我可以直接将一个系列聚合到一个列表中,而不会出现任何问题

下面是一个完整的例子。功能(1)、(2)、(3)成功完成。(4) 返回时带有
#ValueError:函数不减少

import pandas as pd

df = pd.DataFrame([['Bob', '1/1/18', 'AType', 'blah', 'test', 'test2'],
                   ['Bob', '1/1/18', 'AType', 'blah2', 'test', 'test3'],
                   ['Bob', '1/1/18', 'BType', 'blah', 'test', 'test2']],
                  columns=['NAME', 'DATE', 'TYPE', 'VALUE A', 'VALUE B', 'VALUE C'])


def grouper(df, func):
    f = {'VALUE A': lambda x: func(x), 'VALUE B': 'last', 'VALUE C': 'last'}
    return df.groupby(['NAME', 'DATE', 'TYPE'])['VALUE A', 'VALUE B', 'VALUE C']\
             .agg(f).reset_index()

# (1) SUCCESS
grouper(df, set)

# (2) SUCCESS
grouper(df, tuple)

# (3) SUCCESS
df.groupby(['NAME', 'DATE', 'TYPE', 'VALUE B', 'VALUE C'])['VALUE A']\
  .apply(list).reset_index()

# (4) FAIL
grouper(df, list)

# AttributeError
# ValueError: Function does not reduce

经过大量调查,我发现这是一个错误,将在未来的熊猫版本中修复

在中,注意
是instance(res,list)

isinstance(res,list)
省略:

def _aggregate_series_pure_python(self, obj, func):

        group_index, _, ngroups = self.group_info

        counts = np.zeros(ngroups, dtype=int)
        result = None

        splitter = get_splitter(obj, group_index, ngroups, axis=self.axis)

        for label, group in splitter:
            res = func(group)
            if result is None:
                if (isinstance(res, (Series, Index, np.ndarray))):
                    raise ValueError('Function does not reduce')
                result = np.empty(ngroups, dtype='O')

            counts[label] = group.shape[0]
            result[label] = res

        result = lib.maybe_convert_objects(result, try_float=0)
        return result, counts

这是存在的问题,您可以尝试agg(列表)将返回相同的,使用元组代替列表:-)。石斑鱼(df,tuple)@Wen,澄清一下,这是(a)一个bug,(b)还没有实现,(c)故意治疗吗?当列表中的东西变得混乱时,原因[1,2,3]将被视为一个系列。我明白了,但你也可以将一个tuple分配给一个系列,例如
df['col']=(1,2,3)
。相关:
def _aggregate_series_pure_python(self, obj, func):

        group_index, _, ngroups = self.group_info

        counts = np.zeros(ngroups, dtype=int)
        result = None

        splitter = get_splitter(obj, group_index, ngroups, axis=self.axis)

        for label, group in splitter:
            res = func(group)
            if result is None:
                if (isinstance(res, (Series, Index, np.ndarray))):
                    raise ValueError('Function does not reduce')
                result = np.empty(ngroups, dtype='O')

            counts[label] = group.shape[0]
            result[label] = res

        result = lib.maybe_convert_objects(result, try_float=0)
        return result, counts