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,请参阅以下文章。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐