建设部网站防排烟规范,温州专业营销网站制作,商城系统平台开发,微网站页面Hadley Wickham#xff08;许多热门R语言包的作者#xff09;创造了一个用于表示分组运算的术语split-apply-combine#xff08;拆分-应用-合并#xff09;#xff0c;这个词很好的描述了整个过程。分组运算的第一个阶段#xff0c;pandas对象#xff08;无…Hadley Wickham许多热门R语言包的作者创造了一个用于表示分组运算的术语split-apply-combine拆分-应用-合并这个词很好的描述了整个过程。分组运算的第一个阶段pandas对象无论是Series、DataFrame还是其他的中的数据会根据你所提供的一个或多个键被拆分split为多组。拆分操作是在对象的特定轴上执行的。例如DataFrame可以在其行axis0或列axis1上进行分组。然后将一个函数应用apply到各个分组并产生一个新值。最后所有这些函数的执行结果会被合并combine到最终的结果对象中去。PART I. groupby方法PART II. GroupBy对象i GroupBy对象ii 对/GroupBy对象进行迭代和转化iiiGroupBy对象的常用方法PART II. groupby方法的分组键i 列名作为分组键df.groupby(key1).mean()df.groupby([key1,key2]).mean()ii 列表作为分组键df.groupby(l)[size].count()iii 数组作为分组键df.groupby([states,year])[data1].mean()iv 字典作为分组键df.groupby(mapping, axis1).sum()v Series作为分组键people.groupby(map_series, axis1).count()df.groupby([df[key1],df[key2]]).mean()vi 索引作为分组键df.groupby(levelcty,axis1).count()df.groupby(level0,axis1).count()vii dtype作为分组键df.groupby(df.dtypes,axis1).size()viii函数作为分组键people.groupby(len).sum()df.groupby(lambda x: x.day)[volume].sum()ix 函数跟数组、列表、字典、Series混合使用作为分组键people.groupby([len,key_list]).sum()PART I . groupby方法groupby(byNone, axis0, levelNone, as_indexTrue, sortTrue, group_keysTrue, squeezeFalse, observedFalse, **kwargs)by : mapping, function, label, or list of labelsUsed to determine the groups for the groupby.If by is a function, its called on each value of the objectsindex. If a dict or Series is passed, the Series or dict VALUESwill be used to determine the groups (the Series values are firstaligned; see .align() method). If an ndarray is passed, thevalues are used as-is determine the groups. A label or list oflabels may be passed to group by the columns in self. Noticethat a tuple is interpreted a (single) key.axis : {0 or index, 1 or columns}, default 0Split along rows (0) or columns (1).level : int, level name, or sequence of such, default NoneIf the axis is a MultiIndex (hierarchical), group by a particularlevel or levels.as_index : bool, default TrueFor aggregated output, return object with group labels as theindex. Only relevant for DataFrame input. as_indexFalse iseffectively SQL-style grouped output.sort : bool, default TrueSort group keys. Get better performance by turning this off.Note this does not influence the order of observations within eachgroup. Groupby preserves the order of rows within each group.group_keys : bool, default TrueWhen calling apply, add group keys to index to identify pieces.squeeze : bool, default FalseReduce the dimensionality of the return type if possible,otherwise return a consistent type.observed : bool, default FalseThis only applies if any of the groupers are Categoricals.If True: only show observed values for categorical groupers.If False: show all values for categorical groupers.重点参数:by axis level as_index PART II. GroupBy对象iGroupBy对象假设想要按key1进行分组并计算data1列的平均值。实现该功能的方式有很多而这里要用的是访问data1并根据key1调用groupby变量grouped是一个SeriesGroupBy对象, 变量grouped2是一个DataFrameGroupBy对象。它们实际上还没有进行任何计算只是含有一些有关分组键key1的中间数据。换言之该对象已经有了接下来对各分组执行运算所需的信息。ii对/GroupBy对象进行迭代和转化GroupBy对象支持迭代可以产生一组二元元组由分组名和数据块组成分组键为单列分组键为多列通过列表生成式或list()方法可以把groupby对象转换为分组名数据块组成的元组的列表其实我们还可以把groupby对象转换为字典iiiGroupBy对象的常用方法GroupBy对象的常用方法除了常见的sum、mean、count等优化好的聚合函数还有返回不同分组大小的Series的简便方法size()除此之外还可以对groupby对象传入自定义的函数agg/apply。这部分的内容将放在下面一篇详细展开。例如我们可以调用GroupBy的mean和count方法来计算分组平均值和分组计数groupby对象的size方法groupby对象的size方法可以返回一个含有分组大小的Series对groupby对象调用count不行吗倒也不是不行就是格式不太友好。所以还是size方法好PART III. groupby方法的分组键分组键的形式列表或数组其长度与待分组的轴一样表示DataFrame某个列名的值字典或Series给出待分组轴上的值与分组名之间的对应关系函数用于处理轴索引或索引中的各个标签即 列表/数组、列名、字典、Series、函数注意后面三种都只是快捷方式最终目的都是产生一组用于拆分对象的值而且任何东西最终都会被转换为数组。i列名作为分组键可以用【一个列名字符串或一个列名字符串的列表】选取部分列进行聚合对于由DataFrame产生的GroupBy对象如果用一个列名字符串或一个列名字符串的列表对其进行索引就能实现选取部分列进行聚合的目的。尤其对于大数据集很可能只需要对部分列进行聚合。df.groupby(key1)[data1] 等价于 df[data1].groupby(df[key1])
df.groupby(key1)[[data2]] 等价于 df[[data2]].groupby(df[key1)]在执行df.groupby(key1).mean()时结果中没有key2列。这是因为df[key2]不是数值数据俗称“麻烦列”所以被从结果中排除了。默认情况下所有数值列都会被聚合虽然有时候可能会被过滤为一个子集。聚合单列并以DataFrame形式得到结果聚合单列并以Series形式得到结果ii列表作为分组键iii数组作为分组键 iv字典作为分组键列的分组关系如下只需把这个包含分组关系的字典传给groupby即可vSeries作为分组键Series也有字典同样的功能它可以被看作一个固定大小的映射。对于上面那个例子如果用Series作为分组键则pandas会检查Series以确保其索引跟分组轴是对齐的。多个Series作为分组键.mean()的调用过程先略去不讲。这里最重要的是数据Series根据分组键进行了聚合产生了一个新的Series其索引为唯一值。之所以结果中索引的名称为key1、key2是因为原始DataFrame的列df[key1]、df[key2]就叫这个名字。通过对两个键进行分组得到的Series具有一个层次化索引由唯一的键值对组成reshape一下vi索引作为分组键向level关键字传入级别编号或名称根据索引级别分组层次化索引最方便的地方在于它能够根据索引级别进行聚合。要实现该目的通过level关键字传入级别编号或名称即可viidtype作为分组键在axis1上根据dtype对列进行分组viii函数作为分组键相较于字典或SeriesPython函数在定义分组映射关系时可以更有创意且更为抽象。任何被当作分组键的函数都会在各个索引值上被调用一次其返回值就会被用作分组名称。( If by is a function, its called on each value of the objects index.)假设我们现在想根据人名的长度进行分组函数作为分组键很灵活下面是12月1日1分钟K线的数据求这一天的总成交量除了用df[volume].sum()还可以用将lambda函数作为分组键进行聚合的方法实现path rC:UsersbyqpzDesktop现货策略现货高频新策略12.01.csv
df pd.read_csv(path, enginepython,encodingutf_8_sig,index_coltime,parse_datesTrue)
df[volume].sum()
119939049.16099769
df.groupby(lambda x: x.day)[volume].sum()
1 1.199390e08
Name: volume, dtype: float64ix函数跟数组、列表、字典、Series混合使用作为分组键混合使用不是问题因为任何东西最终都会被转换为数组