我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在机器学习中,DataFramendarray作为数据样本的常见数据类型。对此类数据的统计和加工是必不可少的操作。在前面的文章里面,有个需求是对ndarray中的值进行出现次数的统计。那么,在本文的需求中,这个需求变成了对DataFrame里面的数据进行出现次数的统计。

苏南大叔:python,如何统计DataFrame类型变量中成员出现的次数? - dataframe-count
python,如何统计DataFrame类型变量中成员出现的次数?(图10-1)

大家好,这里是苏南大叔的“平行空间笔记本”博客,这里记录苏南大叔的一些代码编程经验。本文要解决的需求是:DataFrame数据类型里面的值频统计问题。测试环境:win10python@3.11.0sklearn@1.2.2

测试样本数据集

本文的测试样本,还是来自标准的鸢尾花数据集iris.csv
对鸢尾花数据集的解读,请参考文章:

为了实现本文的需求,在这一步中,先读取它为DataFrame类型。代码如下:

import pandas as pd
df = pd.read_csv("iris.csv",skiprows=1,names=["a","b","c","d","label"]) 
X = df.iloc[:,:-1]
y = df.iloc[:,-1:]

注意,这里读取到的是DataFrame类型,并不是ndarray类型。这两种数据类型的相互转化,请参考文章:

苏南大叔:python,如何统计DataFrame类型变量中成员出现的次数? - dataframe-data
python,如何统计DataFrame类型变量中成员出现的次数?(图10-2)

.value_counts()

为了统计DataFrame数据类型成员的出现次数,这里有个比较好的方法:

df.value_counts()

比如对机器学习的数据来源Xy的统计,代码如下:

X.value_counts()
y.value_counts()
df['label'].value_counts()

结果如下图所示:

苏南大叔:python,如何统计DataFrame类型变量中成员出现的次数? - group分组
python,如何统计DataFrame类型变量中成员出现的次数?(图10-3)

可以看到:对于多维度的X来说,显然还不是我们想要的效果,它是一个group by的效果。

分组统计groupby效果

对于多行多列的DataFrame来说,使用.value_counts()会隐式地得到一个groupby的效果。和苏南大叔想象的结果有所差距。

df['label'].value_counts()
df.value_counts()
df[:][:].value_counts()

苏南大叔:python,如何统计DataFrame类型变量中成员出现的次数? - groupby
python,如何统计DataFrame类型变量中成员出现的次数?(图10-4)

除了隐式的这种分组外,还可以主动分组:

df['b'].groupby(df['a']).value_counts()
df['a'].groupby(df['b']).value_counts()

苏南大叔:python,如何统计DataFrame类型变量中成员出现的次数? - 分组标准
python,如何统计DataFrame类型变量中成员出现的次数?(图10-5)

全面统计DataFrame整体

下面的代码,会得到一个分组的结果,

df.value_counts()

下面的代码也许是个更好的方式:

pd.DataFrame(df.values.reshape(-1,1)).value_counts()

苏南大叔:python,如何统计DataFrame类型变量中成员出现的次数? - 统计效果新
python,如何统计DataFrame类型变量中成员出现的次数?(图10-6)

上面代码里面的-1是指所有的行,细品...

全面统计某一行所有成员(转换一下ndarray

猛的一看,但实际还是一个group分组的效果,不符合要求。

df[0:1][:].value_counts()

苏南大叔:python,如何统计DataFrame类型变量中成员出现的次数? - 某一行效果对比
python,如何统计DataFrame类型变量中成员出现的次数?(图10-7)

pd.DataFrame(df[0:1][:].values.reshape(-1,1)).value_counts()

全面统计某一列所有成员(直接就可以统计)

df["label"].value_counts()
df[:]["label"].value_counts()

这里对某列(不是某行)数据的统计结果,毕竟符合预期。

苏南大叔:python,如何统计DataFrame类型变量中成员出现的次数? - 这个效果很一致
python,如何统计DataFrame类型变量中成员出现的次数?(图10-8)

只统计某列中其中一个值的出现次数

直接统计某一列中某个值的出现次数,有下面几种方法:

(df.label == '1').sum()
df.query('label == "a"').label.count()
df[df.label == '1'].shape[0]
len(df[df['label'] == '1'])

苏南大叔:python,如何统计DataFrame类型变量中成员出现的次数? - 单独统计某个数据
python,如何统计DataFrame类型变量中成员出现的次数?(图10-9)

特别提示

值得特别注意的是:本文中的.value_counts()是函数调用,而不是取属性值.value_counts。在这里,少写了()并不会报错!但是会得到错误的结果!

y.value_counts
y.value_counts()

苏南大叔:python,如何统计DataFrame类型变量中成员出现的次数? - 特别友情提示
python,如何统计DataFrame类型变量中成员出现的次数?(图10-10)

参考文献

结束语

dataframe默认下,对某行或者某多行数据的统计的时候,默认是个分组效果。如果它不符合你的想法,那么利用ndarrayreshape函数,来做个转化就可以了。

结束语写点啥好呢?想换个风格,写段幽默的无关主题的一段话。比如人生感言?你觉得如何?更多python经验文章,请点击苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python