35_Pandas计算满足特定条件的元素的数量
35_Pandas计算满足特定条件的元素的数量将说明在pandas.DataFrame和pandas.Series中,如何按行/列以及整体来计算满足特定条件的元素数。请参阅以下文章,了解如何提取符合条件的行。09_Pandas从多个条件(AND,OR,NOT)中提取行另外,如果要为每一列计算唯一元素,请参见以下文章。15_Pandas计算元素的数量和频率(出现的次数)对以下内容进行具体的说明。满足
35_Pandas计算满足特定条件的元素的数量
将说明在pandas.DataFrame和pandas.Series中,如何按行/列以及整体来计算满足特定条件的元素数。
请参阅以下文章,了解如何提取符合条件的行。
另外,如果要为每一列计算唯一元素,请参见以下文章。
对以下内容进行具体的说明。
- 满足特定条件的元素数量的计数流程
- 计数pandas.DataFrame中的任何列
- 多个条件的逻辑乘积(和),逻辑和(或)和否定(非)
具体的例子如下。 - 通过指定数值条件进行计数
- 通过指定字符串条件进行计数
- 计算缺失值NaN的数量,非NaN元素的数量
以下面的数据为例。
import pandas as pd
df = pd.read_csv('./data/35/sample_pandas_normal.csv')
print(df)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
满足特定条件的元素数量的计数流程
满足特定条件的元素数量的计数流程如下。
- 判断pandas.DataFrame,pandas.Series对象的每个元素并获取布尔类型(真,假)
- 用sum()方法计算布尔对象
- 按列计数:sum()
- 每行计数:sum(axis= 1)
- 总计数:values.sum()
将比较运算符应用于pandas.DataFrame和pandas.Series对象时,将判断每个元素,并获得相同大小的布尔类型(True,False)pandas.DataFrame和pandas.Series对象。
df_bool = (df == 'CA')
print(df_bool)
# name age state point
# 0 False False False False
# 1 False False True False
# 2 False False True False
# 3 False False False False
# 4 False False True False
# 5 False False False False
在Python中,True被视为1,而False被视为0,因此在布尔值对象上调用sum()方法将为您提供满足条件的元素数。
默认情况下,不带参数时,它按列计算,而参数axis=1时,则按行计算。
print(df_bool.sum())
# name 0
# age 0
# state 3
# point 0
# dtype: int64
print(df_bool.sum(axis=1))
# 0 0
# 1 1
# 2 1
# 3 0
# 4 1
# 5 0
# dtype: int64
pandas.DataFrame和pandas.Series可以将整个元素的数据获取为具有值属性的NumPy数组numpy.ndarray。
与pandas.DataFrame方法sum()不同,numpy.ndarray方法sum()默认情况下计算总和。因此,如果从bool对象的属性值(numpy.ndarray)调用sum(),则可以获得满足条件的元素总数(总数)。
print(df_bool.values)
# [[False False False False]
# [False False True False]
# [False False True False]
# [False False False False]
# [False False True False]
# [False False False False]]
print(type(df_bool.values))
# <class 'numpy.ndarray'>
print(df_bool.values.sum())
# 3
计数pandas.DataFrame中的任何列
如果如上例所示将比较运算符应用于pandas.DataFrame,将对所有元素执行比较操作。
要计算满足任何列条件的元素,请使用[]等指定列并执行相同的过程。
s_bool = df['age'] < 25
print(s_bool)
# 0 True
# 1 False
# 2 True
# 3 False
# 4 True
# 5 False
# Name: age, dtype: bool
print(s_bool.sum())
# 3
有关行/列的选择和提取,请参见以下文章。
多个条件的逻辑乘积(和),逻辑和(或)和否定(非)
当组合多个条件时,将每个条件(由其生成的布尔值的对象)括在括号()中,然后
- AND:&
- 或:|
连接。 - 否定(不):〜
也可以使用。
df_bool_multi = ((df == 'CA') | (df == 70))
print(df_bool_multi)
# name age state point
# 0 False False False False
# 1 False False True False
# 2 False False True True
# 3 False False False True
# 4 False False True False
# 5 False False False False
print(df_bool_multi.sum())
# name 0
# age 0
# state 3
# point 2
# dtype: int64
print(df_bool_multi.sum(axis=1))
# 0 0
# 1 1
# 2 2
# 3 1
# 4 1
# 5 0
# dtype: int64
print(df_bool_multi.values.sum())
# 5
合并列之间的条件。
df_bool_multi_and = ((df['state'] == 'CA') & (df['age'] < 30))
print(df_bool_multi_and)
# 0 False
# 1 False
# 2 True
# 3 False
# 4 True
# 5 False
# dtype: bool
print(df_bool_multi_and.sum())
# 2
df_bool_multi_or = ((df['state'] == 'CA') | (df['age'] < 30))
print(df_bool_multi_or)
# 0 True
# 1 True
# 2 True
# 3 False
# 4 True
# 5 False
# dtype: bool
print(df_bool_multi_or.sum())
# 4
否定(不):〜 示例。
df_bool_not = ~(df == 'CA')
print(df_bool_not)
# name age state point
# 0 True True True True
# 1 True True False True
# 2 True True False True
# 3 True True True True
# 4 True True False True
# 5 True True True True
print(df_bool_not.sum())
# name 6
# age 6
# state 3
# point 6
# dtype: int64
print(df_bool_not.sum(axis=1))
# 0 4
# 1 3
# 2 3
# 3 4
# 4 3
# 5 4
# dtype: int64
print(df_bool_not.values.sum())
# 21
通过指定数值条件进行计数
如前面的示例中所述,比较运算符<,<=,>,> =,== 、! =等可以用于数字。
df_num = df[['age', 'point']]
print(df_num)
# age point
# 0 24 64
# 1 42 92
# 2 18 70
# 3 68 70
# 4 24 88
# 5 30 57
print((df_num <= 70).sum())
# age 6
# point 4
# dtype: int64
print(((df['age'] > 20) & (df['age'] < 40)).sum())
# 3
print((df_num % 2 == 1).sum())
# age 0
# point 1
# dtype: int64
通过指定字符串条件进行计数
除比较运算符外,pandas.Series的字符串方法str还可用于字符串。 字符串方法如下。
- str.contains():包含特定的字符串
- str.endswith():以特定字符串结尾
- str.startswith():以特定的字符串开头
- str.match():匹配正则表达式模式
请注意,字符串方法是pandas.Series方法,不在pandas.DataFrame中。
df_str = df[['name', 'state']]
print(df_str)
# name state
# 0 Alice NY
# 1 Bob CA
# 2 Charlie CA
# 3 Dave TX
# 4 Ellen CA
# 5 Frank NY
print((df_str == 'NY').sum())
# name 0
# state 2
# dtype: int64
print(df_str['name'].str.endswith('e'))
# 0 True
# 1 False
# 2 True
# 3 True
# 4 False
# 5 False
# Name: name, dtype: bool
print(df_str['name'].str.endswith('e').sum())
# 3
有关如何使用字符串方法提取行的信息,请参见以下文章。
计算缺失值NaN的数量,非NaN元素的数量
使用泰坦尼克号幸存者数据作为处理缺失值NaN的示例。
df = pd.read_csv('./data/35/train.csv')
print(df.head())
# PassengerId Survived Pclass \
# 0 1 0 3
# 1 2 1 1
# 2 3 1 3
# 3 4 1 1
# 4 5 0 3
# Name Sex Age SibSp \
# 0 Braund, Mr. Owen Harris male 22.0 1
# 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1
# 2 Heikkinen, Miss. Laina female 26.0 0
# 3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1
# 4 Allen, Mr. William Henry male 35.0 0
# Parch Ticket Fare Cabin Embarked
# 0 0 A/5 21171 7.2500 NaN S
# 1 0 PC 17599 71.2833 C85 C
# 2 0 STON/O2. 3101282 7.9250 NaN S
# 3 0 113803 53.1000 C123 S
# 4 0 373450 8.0500 NaN S
如果您只想检查不缺少值Nan的元素数量,则可以使用info()方法显示它们。
请注意,info()方法是pandas.DataFrame方法,不在pandas.Series中。
df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 891 entries, 0 to 890
# Data columns (total 12 columns):
# PassengerId 891 non-null int64
# Survived 891 non-null int64
# Pclass 891 non-null int64
# Name 891 non-null object
# Sex 891 non-null object
# Age 714 non-null float64
# SibSp 891 non-null int64
# Parch 891 non-null int64
# Ticket 891 non-null object
# Fare 891 non-null float64
# Cabin 204 non-null object
# Embarked 889 non-null object
# dtypes: float64(2), int64(5), object(5)
# memory usage: 83.6+ KB
下面的示例是pandas.DataFrame,但是使用pandas.Series可以进行相同的处理。
使用notull()方法计算丢失的NaN的数量。 notull()是一种确定每个元素是否为NaN的方法。
要对数字进行计数,可以像前面的示例一样应用sum()。
print(df.isnull().head())
# PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket \
# 0 False False False False False False False False False
# 1 False False False False False False False False False
# 2 False False False False False False False False False
# 3 False False False False False False False False False
# 4 False False False False False False False False False
# Fare Cabin Embarked
# 0 False True False
# 1 False False False
# 2 False True False
# 3 False False False
# 4 False True False
print(df.isnull().sum())
# PassengerId 0
# Survived 0
# Pclass 0
# Name 0
# Sex 0
# Age 177
# SibSp 0
# Parch 0
# Ticket 0
# Fare 0
# Cabin 687
# Embarked 2
# dtype: int64
print(df.isnull().sum(axis=1).head())
# 0 1
# 1 0
# 2 1
# 3 0
# 4 1
# dtype: int64
print(df.isnull().values.sum())
# 866
如果要获取不缺少值Nan的元素数作为pandas.Series或标量值,请使用count()方法。 与sum()类似,如果省略参数,则对列处理count();如果参数axis= 1,则对行处理count()。
print(df.count())
# PassengerId 891
# Survived 891
# Pclass 891
# Name 891
# Sex 891
# Age 714
# SibSp 891
# Parch 891
# Ticket 891
# Fare 891
# Cabin 204
# Embarked 889
# dtype: int64
print(df.count(axis=1).head())
# 0 11
# 1 12
# 2 11
# 3 12
# 4 11
# dtype: int64
print(df.count().sum())
# 9826
要将缺失值NaN排除或替换为另一个值,或者确定行/列是否包含缺失值NaN,请参阅以下文章。
更多推荐
所有评论(0)