
在数据分析中,我们经常需要根据DataFrame中多个分类变量的组合来计算数值型变量的统计量。例如,在一个包含产品类别、地区和时间等维度的销售数据集中,我们可能需要分析每个特定产品在特定地区和时间段内的销售额中位数、平均值、总销量以及销售额的分布情况(如90%和10%分位数)。本文将详细介绍如何使用Pandas库高效地完成这类任务,包括数据分组、多指标聚合、处理缺失组合以及结果的格式化输出。
首先,我们创建一个示例DataFrame,它包含三个分类变量(Var1, Var2, Var3)和一个数值变量(Value),模拟实际数据场景。
import pandas as pd
import numpy as np
# 创建示例数据
data = {
'Var1': [True, False, True, False, True, False, True, False, True],
'Var2': [1, 2, 3, 1, 2, 3, 1, 2, 3],
'Var3': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
'Value': [12, 93, 28, 23, 94, 12, 85, 23, 2]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)原始DataFrame:
Var1 Var2 Var3 Value 0 True 1 A 12 1 False 2 B 93 2 True 3 C 28 3 False 1 A 23 4 True 2 B 94 5 False 3 C 12 6 True 1 A 85 7 False 2 B 23 8 True 3 C 2
核心任务是计算Var1, Var2, Var3所有组合的Value列的统计数据。Pandas的groupby()结合agg()方法是实现这一目标的强大工具。
我们将Var1, Var2, Var3作为分组键,然后对Value列应用多个聚合函数。agg()方法允许我们通过字典形式指定要计算的统计量及其对应的列名。
# 对指定列进行分组并计算统计量
grouped_stats = df.groupby(["Var1", "Var2", "Var3"]).agg(
Med=("Value", "median"), # 中位数
Mean=("Value", "mean"), # 平均值
Count=("Value", "count"), # 计数
q90=("Value", lambda x: x.quantile(q=0.9)), # 90%分位数
q10=("Value", lambda x: x.quantile(q=0.1)) # 10%分位数
)
print("\n分组聚合后的统计数据(仅包含现有组合):")
print(grouped_stats)输出示例:
分组聚合后的统计数据(仅包含现有组合):
Med Mean Count q90 q10
Var1 Var2 Var3
False 1 A 23.0 23.0 1.0 23.0 23.0
2 B 58.0 58.0 2.0 81.0 35.0
3 C 12.0 12.0 1.0 12.0 12.0
True 1 A 48.5 48.5 2.0 77.7 19.3
2 B 94.0 94.0 1.0 94.0 94.0
3 C 15.0 15.0 2.0 25.4 4.6解释:
groupby()默认只返回数据中实际存在的组合。如果我们需要确保所有可能的组合(即使某些组合在原始数据中没有出现)都在结果中显示,并用NaN填充其统计数据,我们可以使用reindex()方法。
首先,我们需要手动生成所有可能的Var1, Var2, Var3组合。
# 获取所有列的唯一值
var1_unique = df['Var1'].unique()
var2_unique = df['Var2'].unique()
var3_unique = df['Var3'].unique()
# 创建所有可能的组合作为MultiIndex
all_combinations_index = pd.MultiIndex.from_product(
[var1_unique, var2_unique, var3_unique],
names=["Var1", "Var2", "Var3"]
)
# 使用reindex()将所有组合添加到结果中
final_stats_df = grouped_stats.reindex(all_combinations_index)
print("\n填充所有组合后的统计数据:")
print(final_stats_df)输出示例:
填充所有组合后的统计数据:
Med Mean Count q90 q10
Var1 Var2 Var3
True 1 A 48.5 48.5 2.0 77.7 19.3
B NaN NaN NaN NaN NaN
C NaN NaN NaN NaN NaN
2 A NaN NaN NaN NaN NaN
B 94.0 94.0 1.0 94.0 94.0
C NaN NaN NaN NaN NaN
3 A NaN NaN NaN NaN NaN
B NaN NaN NaN NaN NaN
C 15.0 15.0 2.0 25.4 4.6
False 1 A 23.0 23.0 1.0 23.0 23.0
B NaN NaN NaN NaN NaN
C NaN NaN NaN NaN NaN
2 A NaN NaN NaN NaN NaN
B 58.0 58.0 2.0 81.0 35.0
C NaN NaN NaN NaN NaN
3 A NaN NaN NaN NaN NaN
B NaN NaN NaN NaN NaN
C 12.0 12.0 1.0 12.0 12.0解释:
如果需要将每个组合的统计数据作为单独的DataFrame或以特定格式打印,可以再次使用groupby()方法对最终的统计DataFrame进行迭代。
print("\n逐个组合输出统计数据:")
# 迭代输出每个组合的统计数据
for combo, stats_df in final_stats_df.groupby(level=[0, 1, 2]):
print(f"\n组合: {combo}")
print(stats_df)
print("-" * 50)输出示例:
逐个组合输出统计数据:
组合: (True, 1, 'A')
Med Mean Count q90 q10
Var1 Var2 Var3
True 1 A 48.5 48.5 2.0 77.7 19.3
--------------------------------------------------
组合: (True, 1, 'B')
Med Mean Count q90 q10
Var1 Var2 Var3
True 1 B NaN NaN NaN NaN NaN
--------------------------------------------------
... (省略其他组合)
组合: (False, 3, 'C')
Med Mean Count q90 q10
Var1 Var2 Var3
False 3 C 12.0 12.0 1.0 12.0 12.0
--------------------------------------------------解释:
将上述所有步骤整合到一个完整的脚本中:
import pandas as pd
import numpy as np
# 1. 准备示例数据
data = {
'Var1': [True, False, True, False, True, False, True, False, True],
'Var2': [1, 2, 3, 1, 2, 3, 1, 2, 3],
'Var3': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
'Value': [12, 93, 28, 23, 94, 12, 85, 23, 2]
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
print("-" * 50)
# 2. 多列组合的统计聚合
grouped_stats = df.groupby(["Var1", "Var2", "Var3"]).agg(
Med=("Value", "median"),
Mean=("Value", "mean"),
Count=("Value", "count"),
q90=("Value", lambda x: x.quantile(q=0.9)),
q10=("Value", lambda x: x.quantile(q=0.1))
)
print("\n分组聚合后的统计数据(仅包含现有组合):")
print(grouped_stats)
print("-" * 50)
# 3. 填充所有可能的组合
var1_unique = df['Var1'].unique()
var2_unique = df['Var2'].unique()
var3_unique = df['Var3'].unique()
all_combinations_index = pd.MultiIndex.from_product(
[var1_unique, var2_unique, var3_unique],
names=["Var1", "Var2", "Var3"]
)
final_stats_df = grouped_stats.reindex(all_combinations_index)
print("\n填充所有组合后的统计数据:")
print(final_stats_df)
print("-" * 50)
# 4. 迭代输出每个组合的统计数据
print("\n逐个组合输出统计数据:")
for combo, stats_df in final_stats_df.groupby(level=[0, 1, 2]):
print(f"\n组合: {combo}")
print(stats_df)
print("-" * 50)通过本文介绍的方法,你可以高效地对DataFrame中多个分类变量的组合进行多维度统计分析,并灵活地处理和展示结果,这在各种数据分析场景中都非常实用。
以上就是利用Pandas对DataFrame多列组合进行统计分析与结果展示的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号