如何对DataFrame某列的每个唯一值自动执行另一列的value_counts()?
解决方案
你可以通过以下几种高效方式批量实现需求,无需逐个筛选唯一值:
方法1:groupby 结合 value_counts
直接按目标列分组后,对target列应用统计方法,支持频数或百分比统计:
import pandas as pd # 统计每个sepal length对应的target频数 result_counts = data.groupby('sepal length (cm)')['target'].agg(pd.Series.value_counts) # 统计百分比(归一化后转成百分比格式) result_percent = data.groupby('sepal length (cm)')['target'].agg(lambda x: x.value_counts(normalize=True)*100) display(result_percent)
方法2:透视表(pivot_table)
如果需要规整的表格形式,把target的不同取值作为列展示:
# 生成频数透视表 pivot_counts = pd.pivot_table(data, index='sepal length (cm)', columns='target', aggfunc='size', fill_value=0) # 生成百分比透视表(按行归一化) pivot_percent = pivot_counts.apply(lambda x: x/x.sum()*100, axis=1) display(pivot_percent)
方法3:交叉表(crosstab)
用pd.crosstab直接生成列联表,适合快速查看分布:
# 生成频数交叉表 cross_counts = pd.crosstab(data['sepal length (cm)'], data['target']) # 生成百分比交叉表(按行归一化) cross_percent = pd.crosstab(data['sepal length (cm)'], data['target'], normalize='index')*100 display(cross_percent)
以上三种方法都会自动遍历sepal length (cm)的所有唯一值,一次性输出所有对应的target分布结果,比逐个筛选的方式高效得多。
内容的提问来源于stack exchange,提问作者Rod3291
相关产品推荐
相关产品推荐

