Pandas GroupBy 计算每个组合的出现次数
在这篇文章中,我们将对两列进行GroupBy,并计算Pandas中每个组合的出现次数。
DataFrame.groupby() 方法用于将DataFrame分成组。它将生成存在于数据框某一列的类似数据计数的数量。
语法: DataFrame.groupby(by=None, axis=0, level=None )
参数:
- by:映射、函数、字符串、标签或iterable来分组元素。
- axis:按行(axis=0)或列(axis=1)分组。
- level: 整数。按一个或多个特定的级别对该组的值。
为了理解这一概念,我们将使用下面给出的一个简单的数据集。
# Import library
import pandas as pd
import numpy as np
# initialise data of lists.
Data = {'Products':['Box','Color','Pencil','Eraser','Color',
'Pencil','Eraser','Color','Color','Eraser','Eraser','Pencil'],
'States':['Jammu','Kolkata','Bihar','Gujarat','Kolkata',
'Bihar','Jammu','Bihar','Gujarat','Jammu','Kolkata','Bihar'],
'Sale':[14,24,31,12,13,7,9,31,18,16,18,14]}
# Create DataFrame
df = pd.DataFrame(Data, columns=['Products','States','Sale'])
# Display the Output
display(df)
输出:
方法1:使用Pandas的dataframe.size()。
它返回一个元素的总数,它是通过乘以shape方法返回的行和列来进行比较。
语法: dataframe.size
new = df.groupby(['States','Products']).size()
display(new)
输出:
方法2:使用Pandas的dataframe.count()
它用于计算给定轴上的非NA/null观察值的数量。它也适用于非浮动类型的数据。
语法:DataFrame.count(axis=0, level=None, numeric_only=False)
参数:
- axis : 0或’index’为行式,1或’columns’为列式
- level : 如果轴是MultiIndex(分层的),沿某一层次计数,折叠成一个DataFrame。
- numeric_only : 只包括浮点数、英数、布尔值数据
返回: count : 系列(如果指定级别,则为数据框)。
new = df.groupby(['States','Products'])['Sale'].count()
display(new)
输出:
方法3:使用Pandas reset_index()
它是一个重置数据框架索引的方法。reset_index()方法设置一个从0到数据长度的整数列表作为索引。
语法: DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=” )
参数:
- level: int, string or a list to select and remove passed column from index.
- drop: 布尔值,如果为假,则将被替换的索引列添加到数据中。
- inplace:布尔值,如果为真,则在原始数据框架本身中进行更改。
- col_level:选择在哪个列级插入标签。
- col_fill: 对象,决定其他级别如何命名。
返回类型:DataFrame
new = df.groupby(['States','Products'])['Sale'].agg('count').reset_index()
display(new)
输出:
方法4:使用pandas.pivot()函数
它基于DataFrame的3列产生一个透视表。使用来自索引/列的唯一值并填入数值。
语法: pandas.pivot(index, columns, values)
参数:
- index[ndarray] : 标签用于制作新框架的索引。
- columns[ndarray] :用于制作新框架的列的标签。
- values[ndarray] :用于填充新框架的值。
返回:重塑的数据框架。
异常: 如果有任何重复的数据,会引发ValueError。
new = df.groupby(['States','Products'],as_index = False
).count().pivot('States','Products').fillna(0)
display(new)
输出: