
在数据分析中,我们经常需要对数据集进行多维度聚合,以了解不同类别组合下特定属性的分布情况。一个常见的需求是:给定一个dataframe,我们希望根据两列或多列的唯一组合,统计另一列中每个唯一值的出现次数,并将这些计数作为新的列呈现在结果中。
例如,考虑一个包含player(球员)、team(队伍)和result(结果,如'hit'或'miss')的DataFrame。我们可能希望看到每个球员在每个队伍中,分别有多少次'hit'和多少次'miss'。
原始数据示例:
import pandas as pd
df = pd.DataFrame({
'player': ['A', 'A', 'B', 'B', 'C', 'D'],
'team': ['tmX', 'tmX', 'tmX', 'tmX', 'tmY', 'tmY'],
'result': ['hit', 'hit', 'hit', 'miss', 'miss', 'hit']
})
print("原始DataFrame:")
print(df)输出:
原始DataFrame: player team result 0 A tmX hit 1 A tmX hit 2 B tmX hit 3 B tmX miss 4 C tmY miss 5 D tmY hit
期望的输出格式:
我们希望得到一个宽表,其中player和team作为识别列,而result列中的唯一值('hit'和'miss')则作为新的列,显示对应的计数:
player team hit miss 0 A tmX 2 0 1 B tmX 1 1 2 C tmY 0 1 3 D tmY 1 0
传统的Pandas方法如pd.crosstab通常局限于两列的交叉分析,而简单的groupby(['player', 'team'])['result'].count()只会给出每个player-team组合的总结果数,无法按result的唯一值进行细分计数。
为了实现上述需求,我们可以巧妙地结合使用Pandas的groupby、size和unstack方法。
核心代码:
# 解决方案代码
new_df = (
df.groupby(['player', 'team', 'result'])
.size()
.unstack(level='result', fill_value=0)
.reset_index()
)
print("\n期望的输出结果:")
print(new_df)输出:
期望的输出结果: result player team hit miss 0 A tmX 2 0 1 B tmX 1 1 2 C tmY 0 1 3 D tmY 1 0
这个结果与我们期望的输出高度一致,只是列的顺序可能略有不同(player和team在hit和miss之前)。如果需要调整列顺序,可以使用reindex或手动指定。
让我们逐步解析上述解决方案的每个部分:
df.groupby(['player', 'team', 'result'])
.size()
此时Series的结构大致如下:
player team result
A tmX hit 2
B tmX hit 1
miss 1
C tmY miss 1
D tmY hit 1
dtype: int64.unstack(level='result', fill_value=0)
此时DataFrame的结构大致如下:
result hit miss player team A tmX 2.0 0.0 B tmX 1.0 1.0 C tmY 0.0 1.0 D tmY 1.0 0.0
(注意,hit和miss列的数据类型可能为浮点数,因为fill_value=0的存在,如果原始数据没有NaN,也可以保持整数。)
.reset_index()
最终得到我们期望的宽表结构。
通过结合groupby、size和unstack这三个强大的Pandas方法,我们可以灵活高效地解决多列分组后统计特定列唯一值计数并转换为宽表的需求。这种模式在数据探索、特征工程和报告生成中非常实用,能够帮助我们从多维度理解数据分布,从而做出更深入的分析。掌握这一技巧,将显著提升您在Pandas数据处理中的能力。
以上就是Pandas数据分析:多列分组后统计特定列唯一值计数并转为宽表的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号