
本文旨在帮助读者掌握如何使用 Pandas 库对 DataFrame 中多个列的组合进行分组,并计算每个组合的统计数据,包括中位数、平均值、计数、90% 分位数和 10% 分位数。通过 groupby() 和 agg() 函数的灵活运用,以及 MultiIndex 的构建,可以高效地完成数据分析任务,并将结果以清晰的方式呈现。
DataFrame 分组与统计聚合
在数据分析中,经常需要对数据进行分组,然后针对每个组计算统计指标。Pandas 提供了强大的 groupby() 方法来实现这一功能。结合 agg() 方法,可以轻松地计算各种统计量,例如均值、中位数、计数和分位数。
假设我们有以下 DataFrame:
import pandas as pdimport numpy as npdata = {'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(df)
输出:
Var1 Var2 Var3 Value0 True 1 A 121 False 2 B 932 True 3 C 283 False 1 A 234 True 2 B 945 False 3 C 126 True 1 A 857 False 2 B 238 True 3 C 2
我们的目标是根据 Var1、Var2 和 Var3 的组合对数据进行分组,并计算每个组的 Value 列的中位数、平均值、计数、90% 分位数和 10% 分位数。
实现步骤
分组与聚合
使用 groupby() 方法对 DataFrame 进行分组,并使用 agg() 方法计算统计量。
df = 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)),)
这里,agg() 方法接受一个字典,字典的键是新列的名称,值是一个元组,元组的第一个元素是要进行统计的列名,第二个元素是统计函数。 对于分位数,我们使用 lambda 函数来调用 quantile() 方法。
重建索引 (Reindexing)
为了确保所有可能的组合都存在于结果中,即使某些组合在原始数据中没有出现,我们需要重建索引。
df = df.reindex( pd.MultiIndex.from_product( [[True, False], [1, 2, 3], ["A", "B", "C"]], names=["Var1", "Var2", "Var3"] ))
pd.MultiIndex.from_product() 创建一个包含所有可能组合的多重索引。reindex() 方法使用这个多重索引来重新索引 DataFrame。 如果某个组合在原始数据中不存在,则其对应的统计量将为 NaN。
分组打印结果
最后,我们可以遍历分组后的 DataFrame,并打印每个组的结果。
for _, g in df.groupby(level=[0, 1, 2]): print(g) print("-" * 80)
groupby(level=[0, 1, 2]) 按照多重索引的级别进行分组。
完整代码示例
import pandas as pdimport numpy as npdata = {'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)df = 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)),)df = df.reindex( pd.MultiIndex.from_product( [[True, False], [1, 2, 3], ["A", "B", "C"]], names=["Var1", "Var2", "Var3"] ))for _, g in df.groupby(level=[0, 1, 2]): print(g) print("-" * 80)
注意事项
确保在计算分位数时,数据类型是数值型。如果数据类型是字符串,需要先转换为数值型。如果某些组的数据量很小,计算出的分位数可能没有意义。reindex() 方法可以确保所有可能的组合都存在于结果中,但如果组合的数量非常大,可能会导致内存占用过高。
总结
本文介绍了如何使用 Pandas 库对 DataFrame 中多个列的组合进行分组,并计算每个组合的统计数据。通过 groupby() 和 agg() 函数的灵活运用,以及 MultiIndex 的构建,可以高效地完成数据分析任务。这种方法在处理需要对数据进行多维度分析的场景中非常有用。
以上就是Pandas DataFrame 多列组合统计数据计算与分组展示的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1376510.html
微信扫一扫
支付宝扫一扫