分组统计首先根据指定变量的值对数据进行分组,然后对每组数据分别进行统计分析。[大谦Excel,dqexcel点com]
分组描述性统计
【问题描述】
在DataFrame中,根据指定列的唯一值对行数据进行分组,然后对每组数据分别进行描述性统计。
【示例10-4】
本例使用的Excel文件的完整路径为“D:/Samples/ch10/04 分组统计/员工信息表.xlsx”。该文件打开后如图10-2所示,是一些雇员的个人信息。要求根据“工种”列计算不同工种员工的工资的均值、最大值、最小值、中值、方差和内四分极差。
图10-2 雇员个人信息
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是pandas专家,文件路径为:D:/Samples/ch10/04 分组统计/员工信息表.xlsx。该Excel文件的第一个工作表中A-F列为给定数据。用pandas导入Excel文件的数据,引擎为"openpyxl"。根据“工种”变量计算不同工种员工的工资的均值、最大值、最小值、中值、方差和内四分极差。输出计算结果。添加代码注释。
2. 代码
- 根据提示词得到类似下面的代码:
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窗口输出不同工种雇员工资的描述性统计。
>>> == 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参数指定用于分组的列。下面的代码得到不同工种雇员的工资数据。
df.groupby('工种')['工资']
然后用agg方法调用聚合函数计算描述统计量。
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所示,是一些商品的销售明细数据。请根据“时间”列数据的大小汇总每种商品最早售出时的时间、数量和金额。
图10-3 要换
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是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. 代码
- 根据提示词得到类似下面的代码:
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窗口输出提取结果。
>>> == 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方法根据“商品”列进行分组,然后在每个分组中得到“时间”列值最小的行数据,即每个分组中的首次数据。
min_time_df = df.groupby('商品')['时间'].idxmin().apply(lambda x: df.loc[x])
result = min_time_df[['商品', '时间', '数量', '金额']]
将代码中的idxmin方法改为idxmax方法,可以得到每个分组中的末次数据。完整代码为:
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窗口输出提取结果。
>>> == 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所示,是各种商品的销售情况表。请对各销售人员销售的不同商品的数量进行汇总。
图10-4 不同商品的销售情况表
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是pandas专家,文件路径为:D:/Samples/ ch10/04 分组统计/销售情况-多条件汇总.xlsx。该Excel文件的第一个工作表中A1:D18为给定数据,A-D列分别为“日期”、“销售人员”、“商品”和“数量”数据。用pandas导入Excel文件的数据,第1行为索引行,只导入前18行,前4列数据,引擎为"openpyxl",请对各销售人员销售的不同商品的数量进行汇总,汇总结果以表格形式输出。
2. 代码
- 根据提示词得到类似下面的代码:
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窗口输出汇总结果。
>>> == RESTART: D:/Samples/1.py =
数量
销售人员 商品
周德宇 彩电 83
电脑 33
空调 85
房天琦 冰箱 86
相机 19
曹泽鑫 彩电 20
电脑 43
相机 45
王学敏 冰箱 58
彩电 56
【知识点扩展】
本例先用DataFrame对象的groupby方法根据“销售人员”和“商品”进行分组,然后对每个分组中的销量数据求和。
分组按条件统计
【问题描述】
首先按DataFrame中指定列进行数据分组,然后根据每个分组的综述统计量按照给定条件进一步进行统计。
【示例10-7】
本例使用示例10-4的数据,计算不同工种员工的工资大于本工种平均工资的人数。
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是pandas专家,文件路径为:D:/Samples/ch10/04 分组统计/员工信息表.xlsx。该Excel文件的第一个工作表中A-F列为给定数据。用pandas导入Excel文件的数据,引擎为"openpyxl"。计算不同工种员工的工资大于本工种平均工资的人数。输出计算结果,比如:经理 10。添加代码注释。
2. 代码
- 根据提示词得到类似下面的代码:
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窗口输出不同工种员工的工资大于本工种平均工资的人数。
>>> == RESTART: D:/Samples/1.py =
工种
保管员 148
服务员 7
经理 37
dtype: int64
【知识点扩展】
本例首先用groupby方法根据工种进行分组,并得到每个分组中平均工资。然后进一步统计每个分组中工资大于平均工资的人数。