关于Pandas版本: 本文基于 pandas2.2.0 编写。
关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。
传送门: Pandas API参考目录
传送门: Pandas 版本更新及新特性
传送门: Pandas 由浅入深系列教程
本节目录
- Pandas.DataFrame.mode()
- 语法:
- 返回值:
- 参数说明:
- axis 指定计算方向(行或列)
- dropna 忽略缺失值
- numeric_only 只计算纯数值类型的行或列
- 相关方法:
- 示例:
- 例1:计算每列或每行的众数
- 例2、求 `DataFrame` 每行的乘积
- 例3:只计算数据类型是数值的行或列
Pandas.DataFrame.mode()
DataFrame.mode
方法用于返回行或列的众数。
⚠️ 注意 :
某行某列出现次数最多的值就是众数,这个值可以是字符串类型的。
众数可以有多个。
所有元素出现的次数都一样,则这些元素都将作为众数返回。
数值相等的浮点数、整数,在求众数时,会被解析为相同的元素,例如1.0和1 在同行或同列出现,则被理解为数字1出现了2次。
缺失值占位: 指的是构建
DataFrame
时,如果行或列不等长(元素数量不一致),缺失的位置,将以缺失值(Nan)代替。
语法:
DataFrame.mode(axis=0, numeric_only=False, dropna=True)
返回值:
-
DataFrame
以
DataFrame
的形式返回每行或每列的众数。- 众数的数量不一致时,会以 缺失值(NaN) 占位。例1
参数说明:
axis 指定计算方向(行或列)
-
axis : {index (0), columns (1)
axis
参数,用于指定计算方向,即指定计算每行的众数,或计算没列的众数: 例1- 0 or ‘index’: 计算每列众数。
- 1 or ‘columns’: 计算每行的众数。
dropna 忽略缺失值
-
dropna : bool, default True
dropna
参数,用于控制是否在计算众数时忽略缺失值,默认dropna=True
表示缺失值(Nan)不参与众数计算:。例2-
True: 示缺失值(Nan)不参与众数计算(默认)。
⚠️ 注意:
dropna=True
只是计算众数时,不在考虑缺失值(Nan)的数量,但是在结果中依然有可能存在缺失值(Nan)占位。 -
False: 示缺失值(Nan)参与众数计算。
⚠️ 注意:
缺失值的众数,依然是缺失值(Nan)
-
numeric_only 只计算纯数值类型的行或列
-
numeric_only : bool, default False
numeric_only
参数,用于控制是否 只计算纯数值类型的行或列:例3- False: 计算所有数据类型的行或列(默认)。
- True: 只计算数值类型的行或列。
⚠️ 注意 :
在众数计算时,整数、浮点数、布尔值、复数,都可以参与计算。
复数类型的列,如果在返回的
DataFrame
中,需要缺失值(Nan)占位,将表示为 NaN+0.0j
相关方法:
➡️ 相关方法
Series.mode
众数
Series.value_counts
频数(元素数量计数)
DataFrame.value_counts
频数(元素素数量计数)
示例:
测试文件下载:
本文所涉及的测试文件,如有需要,可在文章顶部的绑定资源处下载。
若发现文件无法下载,应该是资源包有内容更新,正在审核,请稍后再试。或站内私信作者索要。
例1:计算每列或每行的众数
例1-1、创建演示数据
import numpy as np
import pandas as pd
df = pd.DataFrame(
[("bird", 2, 2), ("mammal", 4, 1), ("arthropod", 8, 0), ("bird", 2, np.nan)],
index=("falcon", "horse", "spider", "ostrich"),
columns=("species", "legs", "wings"),
)
df
species | legs | wings | |
---|---|---|---|
falcon | bird | 2 | 2.0 |
horse | mammal | 4 | 1.0 |
spider | arthropod | 8 | 0.0 |
ostrich | bird | 2 | NaN |
例1-2、计算每列的众数,可以传递 axis=0
也可以保持默认(不传递axis参数)
df.mode() # 等效于df.mode(axis=0)
species | legs | wings | |
---|---|---|---|
0 | bird | 2.0 | 0.0 |
1 | NaN | NaN | 1.0 |
2 | NaN | NaN | 2.0 |
注意观察 wings 列,由于返回了多个众数 ,其他两列的的结果里,用缺失值占位。
例1-2、计算每列的众数,传递 axis=1
。
df.mode(axis=1)
C:\Users\Administrator\AppData\Local\Temp\ipykernel_11456\1210916842.py:1: UserWarning: Unable to sort modes: '<' not supported between instances of 'int' and 'str'
df.mode(axis=1)
0 | 1 | 2 | |
---|---|---|---|
falcon | 2 | NaN | NaN |
horse | mammal | 4.0 | 1.0 |
spider | arthropod | 8.0 | 0.0 |
ostrich | bird | 2.0 | NaN |
注意观察结果,falcon行里的NaN,是占位缺失值,ostrich行的NaN,则是作为众数返回的NaN。当数据量比较大的时候,你可能将无法判断返回的NaN的具体属性。可以结合dropna
参数,来控制计算众数时,是否包含缺失值。
C:\Users\Administrator\AppData\Local\Temp\ipykernel_11456\1210916842.py:1: UserWarning: Unable to sort modes: '<' not supported between instances of 'int' and 'str' df.mode(axis=1)
这个提示,并不影响结果的正确性,只是在告诉你,当前结果因为数据类型不同,无法排序。
例2、求 DataFrame
每行的乘积
例2-1、构建演示数据
import numpy as np
import pandas as pd
df2 = pd.DataFrame(
[
("字符串1", 2, 2),
("字符串2", 4, 1),
("字符串1", 8, np.nan),
("字符串4", 2, np.nan),
],
index=("第1行", "第2行", "第3行", "第4行"),
columns=("第1列", "第2列", "第3列"),
)
df2
第1列 | 第2列 | 第3列 | |
---|---|---|---|
第1行 | 字符串1 | 2 | 2.0 |
第2行 | 字符串2 | 4 | 1.0 |
第3行 | 字符串1 | 8 | NaN |
第4行 | 字符串4 | 2 | NaN |
观察这个示例数据,如果对列求众数,默认情况下 dropna=True
(表示缺失值不参与众数计算), 那么第1列众数是字符串1,第2列众数是2,第3列众数应该是 1.0和2.0,例如:
df2.mode()
第1列 | 第2列 | 第3列 | |
---|---|---|---|
0 | 字符串1 | 2.0 | 1.0 |
1 | NaN | NaN | 2.0 |
注意观察上面的结果,NaN 是确实占位,不是众数计算结果。
例2-3、当dropna=False
, NaN将会参与到众数计算,例如:
df2.mode(dropna=False)
第1列 | 第2列 | 第3列 | |
---|---|---|---|
0 | 字符串1 | 2 | NaN |
注意观察结果,此时第3列的NaN,是众数结果,而不是占位。
例3:只计算数据类型是数值的行或列
例3-1,构建演示数据
import numpy as np
import pandas as pd
df3 = pd.DataFrame(
[
("字符串1", 2, 2, True,1+2j),
("字符串2", 4, 1, True,1+2j),
("字符串1", 8, np.nan, False,1+2j),
("字符串4", 2, np.nan, True,1+3j),
],
index=("第1行", "第2行", "第3行", "第4行"),
columns=("字符串类型", "整数类型", "浮点数类型", "布尔类型",'复数类型'),
)
df3
字符串类型 | 整数类型 | 浮点数类型 | 布尔类型 | 复数类型 | |
---|---|---|---|---|---|
第1行 | 字符串1 | 2 | 2.0 | True | 1.0+2.0j |
第2行 | 字符串2 | 4 | 1.0 | True | 1.0+2.0j |
第3行 | 字符串1 | 8 | NaN | False | 1.0+2.0j |
第4行 | 字符串4 | 2 | NaN | True | 1.0+3.0j |
注意观察演示数据,浮点数类型这一列,建立数据的时候是整数,因为存在缺失值,导致数据累心被转为浮点数(因为缺失值在某些计算中,会被转为浮点类型的0.0)。
例3-2,只计算数值类型的列,并且不考虑缺失值的数量。
df3.mode(numeric_only=True,dropna=True)
整数类型 | 浮点数类型 | 布尔类型 | 复数类型 | |
---|---|---|---|---|
0 | 2.0 | 1.0 | True | 1.0+2.0j |
1 | NaN | 2.0 | NaN | NaN+0.0j |
注意观察计算结果,出现的NaN,都是占位型的缺失值。