分组统计

分组统计首先根据指定变量的值对数据进行分组,然后对每组数据分别进行统计分析。[大谦Excel,dqexcel点com]

分组描述性统计

【问题描述】

在DataFrame中,根据指定列的唯一值对行数据进行分组,然后对每组数据分别进行描述性统计。

【示例10-4】

本例使用的Excel文件的完整路径为“D:/Samples/ch10/04 分组统计/员工信息表.xlsx”。该文件打开后如图10-2所示,是一些雇员的个人信息。要求根据“工种”列计算不同工种员工的工资的均值、最大值、最小值、中值、方差和内四分极差。

Document Image

图10-2 雇员个人信息

  • ChatGPT提示词模板

新建ChatGPT会话,在提问文本框中输入下面的提示词:

prompt
你是pandas专家,文件路径为:D:/Samples/ch10/04 分组统计/员工信息表.xlsx。该Excel文件的第一个工作表中A-F列为给定数据。用pandas导入Excel文件的数据,引擎为"openpyxl"。根据“工种”变量计算不同工种员工的工资的均值、最大值、最小值、中值、方差和内四分极差。输出计算结果。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件,引擎为"openpyxl"
df = pd.read_excel('D:/Samples/ch10/04 分组统计/员工信息表.xlsx', engine='openpyxl')
# 根据“工种”变量进行分组并计算不同工种员工的工资的均值、最大值、最小值、中值、方差和内四分极差
result = df.groupby('工种')['工资'].agg(['mean', 'max', 'min', 'median', 'var', lambda x: x.quantile(0.75) - x.quantile(0.25)])
# 输出计算结果
print(result)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出不同工种雇员工资的描述性统计。

code.python
>>> == RESTART: D:/Samples/1.py =
            mean      max     min  median           var  <lambda_0>
工种
保管员  2784.282967   8000.0  1575.0  2655.0  5.712346e+05       840.0
服务员  3093.888889   3525.0  2430.0  3075.0  4.471603e+04        82.5
经理   6397.779762  13500.0  3441.0  6050.0  3.328719e+06      1932.5

上面结果中,mean, max, min, median, var和lambda_0分别为不同工种员工工资的均值、最大值、最小值、中值、方差和内四分极差。

【知识点扩展】

pandas中对数据进行分组使用的是DataFrame对象的groupby方法。使用该方法的by参数指定用于分组的列。下面的代码得到不同工种雇员的工资数据。

code.python
df.groupby('工种')['工资']

然后用agg方法调用聚合函数计算描述统计量。

code.python
result = df.groupby('工种')['工资'].agg(['mean', 'max', 'min', 'median', 'var', lambda x: x.quantile(0.75) - x.quantile(0.25)])

因为没有计算内四分极差的聚合函数,这里使用匿名函数进行计算。内四分极差等于数据的0.75分位数减去0.25分位数。

分组提取首次和末次

【问题描述】

在DataFrame中,根据指定列的唯一值对行数据进行分组,然后在每组数据中提取按时间排序后得到的第1条数据或最后1条数据。

【示例10-5】

本例使用的Excel文件的完整路径为“D:/Samples/ch10/04 分组统计/销售流水-首次.xlsx”。该文件打开后如图10-3所示,是一些商品的销售明细数据。请根据“时间”列数据的大小汇总每种商品最早售出时的时间、数量和金额。

Document Image

图10-3 要换

  • ChatGPT提示词模板

新建ChatGPT会话,在提问文本框中输入下面的提示词:

prompt
你是pandas专家,文件路径为:D:/Samples/ ch10/04 分组统计/销售流水-首次.xlsx。该Excel文件的第一个工作表中A1:D10为给定数据,A-D列分别为“时间”、“商品”、“数量”和“金额”数据。用pandas导入Excel文件的数据,第1行为索引行,引擎为"openpyxl"。请根据“时间”列数据的大小汇总每种商品最早售出时的时间、数量和金额,如:对于电视机而言,如果对应的时间2020/10/8是最小的,则输出:电视机 2020/10/8 27 508127。售出时间只要日期,不要时间。

2. ChatGPT提示词模板说明

指明对于每种商品,要根据“时间”列数据的大小提取最早售出时的那条数据。举例进行了说明。售出日期不要时间。

3. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件数据
df = pd.read_excel('D:/Samples/ch10/04 分组统计/销售流水-首次.xlsx', engine='openpyxl')
# 按照商品和时间进行分组,并选取最小时间对应的行
min_time_df = df.groupby('商品')['时间'].idxmin().apply(lambda x: df.loc[x])
# 获取每种商品最早售出时的时间、数量和金额
result = min_time_df[['商品', '时间', '数量', '金额']]
# 将售出时间只要日期,不要时间
result['时间'] = result['时间'].dt.date
# 输出结果
print(result)

4. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出提取结果。

code.python
>>> == RESTART: D:/Samples/1.py =
      商品          时间   数量      金额
商品
冰箱    冰箱  2020-10-06   51  561366
电视机  电视机  2020-10-08   27  508127
电饭煲  电饭煲  2020-10-08  100  100000
空调    空调  2020-10-07   76  427266

【知识点扩展】

本例先用DataFrame对象的groupby方法根据“商品”列进行分组,然后在每个分组中得到“时间”列值最小的行数据,即每个分组中的首次数据。

code.python
min_time_df = df.groupby('商品')['时间'].idxmin().apply(lambda x: df.loc[x])
result = min_time_df[['商品', '时间', '数量', '金额']]

将代码中的idxmin方法改为idxmax方法,可以得到每个分组中的末次数据。完整代码为:

code.python
import pandas as pd
# 读取Excel文件数据
df = pd.read_excel('D:/Samples/ch10/04 分组统计/销售流水-首次.xlsx', engine='openpyxl')
# 按照商品和时间进行分组,并选取最小时间对应的行
min_time_df = df.groupby('商品')['时间'].idxmax().apply(lambda x: df.loc[x])
# 获取每种商品最早售出时的时间、数量和金额
result = min_time_df[['商品', '时间', '数量', '金额']]
# 将售出时间只要日期,不要时间
result['时间'] = result['时间'].dt.date
# 输出结果
print(result)

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出提取结果。

code.python
>>> == RESTART: D:/Samples/1.py =
      商品          时间   数量      金额
商品
冰箱    冰箱  2020-10-10   79  588767
电视机  电视机  2020-10-10   95  384857
电饭煲  电饭煲  2020-10-09  100  100000
空调    空调  2020-10-08  109  379211

多条件汇总

【问题描述】

根据DataFrame中的多列数据进行分组,然后对每个分组进行数据汇总。

【示例10-6】

本例使用的Excel文件的完整路径为“D:/Samples/ch10/04 分组统计/销售情况-多条件汇总.xlsx”。该文件打开后如图10-4所示,是各种商品的销售情况表。请对各销售人员销售的不同商品的数量进行汇总。

Document Image

图10-4 不同商品的销售情况表

  • ChatGPT提示词模板

新建ChatGPT会话,在提问文本框中输入下面的提示词:

prompt
你是pandas专家,文件路径为:D:/Samples/ ch10/04 分组统计/销售情况-多条件汇总.xlsx。该Excel文件的第一个工作表中A1:D18为给定数据,A-D列分别为“日期”、“销售人员”、“商品”和“数量”数据。用pandas导入Excel文件的数据,第1行为索引行,只导入前18行,前4列数据,引擎为"openpyxl",请对各销售人员销售的不同商品的数量进行汇总,汇总结果以表格形式输出。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件前18行,前4列数据
df = pd.read_excel(r'D:/Samples/ch10/04 分组统计/销售情况-多条件汇总.xlsx',
                   engine='openpyxl', usecols='A:D', nrows=18)
# 使用groupby函数和聚合函数sum对销售人员和商品进行分组汇总
result = df.groupby(['销售人员', '商品']).sum()
# 输出结果
print(result)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出汇总结果。

code.python
>>> == RESTART: D:/Samples/1.py =
         数量
销售人员 商品
周德宇  彩电  83
     电脑  33
     空调  85
房天琦  冰箱  86
     相机  19
曹泽鑫  彩电  20
     电脑  43
     相机  45
王学敏  冰箱  58
     彩电  56

【知识点扩展】

本例先用DataFrame对象的groupby方法根据“销售人员”和“商品”进行分组,然后对每个分组中的销量数据求和。

分组按条件统计

【问题描述】

首先按DataFrame中指定列进行数据分组,然后根据每个分组的综述统计量按照给定条件进一步进行统计。

【示例10-7】

本例使用示例10-4的数据,计算不同工种员工的工资大于本工种平均工资的人数。

  • ChatGPT提示词模板

新建ChatGPT会话,在提问文本框中输入下面的提示词:

prompt
你是pandas专家,文件路径为:D:/Samples/ch10/04 分组统计/员工信息表.xlsx。该Excel文件的第一个工作表中A-F列为给定数据。用pandas导入Excel文件的数据,引擎为"openpyxl"。计算不同工种员工的工资大于本工种平均工资的人数。输出计算结果,比如:经理 10。添加代码注释。

2. 代码

  • 根据提示词得到类似下面的代码:
code.python
import pandas as pd
# 读取Excel文件
df = pd.read_excel('D:/Samples/ch10/04 分组统计/员工信息表.xlsx', engine='openpyxl')
# 根据工种分组并计算平均工资
grouped = df.groupby('工种')['工资'].mean()
# 计算每个工种中工资大于本工种平均工资的人数
result = (df['工资'] > df['工种'].map(grouped)).groupby(df['工种']).sum()
# 输出结果
print(result)

3. 使用代码

打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,在IDLE Shell窗口输出不同工种员工的工资大于本工种平均工资的人数。

code.python
>>> == RESTART: D:/Samples/1.py =
工种
保管员    148
服务员      7
经理      37
dtype: int64

【知识点扩展】

本例首先用groupby方法根据工种进行分组,并得到每个分组中平均工资。然后进一步统计每个分组中工资大于平均工资的人数。