Python数据分析之数据聚合与分组运算(拆分、应用、合并) |
您所在的位置:网站首页 › 如何拆分数据集的内容 › Python数据分析之数据聚合与分组运算(拆分、应用、合并) |
笔记目录
1.分组与聚合的原理1.2分组与聚合的过程分为三步1.2.1拆分1.2.2应用1.2.3合并
2. 通过groupby()方法将数据拆分成组2.1 groupby()方法2.2 groupby()方法的by参数2.2.1 按列名进行分组2.2.2 按Series对象进行分组2.2.3 按字典进行分组2.2.4 按函数进行分组
3.数据聚合3.1使用内置统计方法聚合数据3.2面向列的聚合方法3.2.1 agg()方法3.2.2 对每一列数据应用同一个函数3.2.3 对某列数据应用不同的函数3.2.4 对不同列数据应用不同函数
4.分组级运算4.1 数据转换4.1.1 transfrom()方法
4.2 数据应用4.2.1 apply()方法
1.分组与聚合的原理
在Pandas中: 分组:指使用特定的条件将原数据划分为多个组; 聚合:对每个分组中的数据执行某些操作,最后将计算的结果进行整合。 1.2分组与聚合的过程分为三步 1.2.1拆分将数据集按照些标准拆分为若干个组。split拆分方法 1.2.2应用将某个函数或方法(内置和自定义均可)应用到每个分组。apply方法应用 1.2.3合并将产生的新值整合到结果对象中。combine方法整合 2. 通过groupby()方法将数据拆分成组 在Pandas中,可以通过groupby()方法将数据集按照某些标准划分成若干个组。 2.1 groupby()方法![]() by:用于确定进行分组的依据。 level:两层索引指定内外层,0/1。 axis:表示分组轴的方向。 sort:表示是否对分组标签进行排序,接收布尔值,默认为True。 groupby()方法会返回一个 Groupby对象,该对象实际上并没有进行任何计算,只是包含一些关于分组键的中间数据而已。 •使用Series调用groupby()方法返回的是SeriesGroupBy对象。 •使用DataFrame调用groupby()方法返回的是DataFrameBy对象。 2.2 groupby()方法的by参数 by 参数可以接受的数据有4种:列表或数组、DataFrame某列、字典或Series对象、函数 2.2.1 按列名进行分组 如果DataFrame对象的某一列数据符合划分成组的标准,则可以将该列当做分组键来拆分数据集。 ![]() ![]() 查看每个分组的具体内容,使用for循环遍历DataFrameGroupBy对象 group_obj = df.groupby('Key') # 遍历分组对象 for i in group_obj: print(i)![]() 将自定义的Series类对象作为分组键进行分组。 # 按自定义Series对象进行分组 或 通过Series对象进行分组 # 将自定义的Series类对象作为分组键进行分组。 df = pd.DataFrame({'key1': ['A', 'A', 'B', 'B', 'A'], 'key2': ['one', 'two', 'one', 'two', 'one'], 'data1': [2, 3, 4, 6, 8], 'data2': [3, 5, 6, 3, 7]}) se = pd.Series(['a', 'b', 'c', 'a', 'b']) group_obj = df.groupby(by = se) for i in group_obj: # 遍历分组对象 print(i)![]() 如果Series对象与Pandas对象的索引长度不相同时,则只会将具有相同索引的部分数据进行分组。 # 当Series长度与原数据的索引值长度不同时 se = pd.Series(['a', 'a', 'b']) group_obj = df.groupby(se) for i in group_obj: # 遍历分组对象 print(i)![]() 当使用字典对DataFrame进行分组时,则需要确定轴的方向及字典中的映射关系,即字典中的键为列名,字典的值为自定义的分组名。 ![]() ![]() 将函数作为分组键会更加灵活,任何一个被当做分组键的函数都会在各个索引值上被调用一次,返回的值会被用作分组名称。 ![]() ![]() ![]() Pandas中内置的统计方法,比如用于获取最大值和最小值的max()和mix(),这些方法常用于简单地聚合分组中的数据。 # 求平均数 # 按key1进行分组,求每个分组的平均值 df.groupby('key1').mean()![]() 如果内置方法无法满足聚合要求时,则可以自定义函数,将它作为参数传给agg()方法,实现Pandas对象的聚合运算。 data_frame = pd.DataFrame(np.arange(36).reshape((6,6)), columns=list('abcdef')) # 增加一列 data_frame['key'] = pd.Series(list('aaabbb'), name='key') data_frame![]() ![]() func:表示用于汇总数据的函数,可以为单个函数或函数列表。 axis:表示函数作用于轴的方向,0或index表示将函数应用到每一列;1或columns表示将函数应用到每一行,该参数的默认值为0。 3.2.2 对每一列数据应用同一个函数 通过agg()方法进行聚合,最简单的方式就是给该方法的func参数传入一个函数,这个函数既可以是内置的,也可以自定义的。 def range_data_group(arr): return arr.max()-arr.min() # 使用自定义函数聚合分组数据 data_group.agg(range_data_group) # 按key列进行分组 data_group = data_frame.groupby('key') # 利用列表推导式查看分组数据信息 list1=[x for x in data_group] list1![]() ![]() ![]() ![]() ![]() ![]() 可以将两个函数的名称放在列表中,之后在调用agg()方法进行聚合时作为参数传入即可. # 对一列数据用两种函数聚合 data_group.agg([range_data_group, sum])![]() ![]() 如果希望对不同的列使用不同的函数,则可以在agg()方法中传入一个{“列名”:“函数名”}格式的字典。 data_frame = pd.DataFrame(np.arange(36).reshape((6,6)), columns=list('abcdef')) data_group = data_frame.groupby('key') data_group![]() ![]() 如果希望保持与原数据集形状相同,那么可以通过transfrom()方法实现。 ![]() ![]() ![]() apply()方法的使用是十分灵活的,它可以在许多标准用例中替代聚合和转换,另外还可以处理一些比较特殊的用例。 ![]() func:表示应用于某一行或某一列的函数。 axis:表示函数操作的轴向。 broadcast:表示是否将数据进行广播。 data_frame = pd.DataFrame(np.arange(36).reshape((6,6)), columns=list('abcdef')) data_frame['f']![]() ![]() |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |