在数据分析工作中,我们经常会遇到需要先从原始数据中提取符合特定条件的记录,再按照某个维度统计数量,同时还要处理数据中存在的缺失值的情况,Pandas作为Python生态中核心的数据处理库,提供了完善的工具支持这些操作。

条件筛选的基本方法
条件筛选是指根据指定的规则从DataFrame中提取符合条件的行,最常用的是布尔索引方式。我们可以先构造布尔条件,再将条件传入DataFrame的索引中。
比如我们有一个存储用户信息的DataFrame,需要筛选出年龄大于18岁的用户,代码实现如下:
import pandas as pd
import numpy as np
# 构造示例数据
data = {
"user_id": [1, 2, 3, 4, 5],
"age": [16, 22, 25, np.nan, 19],
"city": ["北京", "上海", "广州", "深圳", np.nan]
}
df = pd.DataFrame(data)
# 条件筛选:年龄大于18岁
condition = df["age"] > 18
filtered_df = df[condition]
print(filtered_df)
需要注意的是,如果列中存在缺失值,条件判断的结果会是NaN,对应的行会被自动过滤掉,不会出现在筛选结果中。
分组计数的实现方式
分组计数是按照某个或多个列的取值对数据进行分组,然后统计每个组内的记录数量,核心使用的是groupby方法配合size或者count方法。
size会统计每个组的总行数,包含缺失值所在的行;count会统计每个组中非缺失值的数量,默认忽略缺失值。示例代码如下:
# 按照城市分组计数,使用size统计总行数
group_size = df.groupby("city").size()
print("使用size分组计数结果:")
print(group_size)
# 按照城市分组计数,使用count统计非缺失值数量
group_count = df.groupby("city").count()
print("n使用count分组计数结果:")
print(group_count)
缺失值的处理操作
缺失值会影响筛选和计数的结果准确性,因此需要先进行处理。Pandas提供了多种缺失值处理方式:
- 识别缺失值:使用
isna()或者isnull()方法判断每个元素是否为缺失值,返回布尔类型的DataFrame。 - 过滤缺失值:使用
dropna()方法删除包含缺失值的行或列,默认删除行。 - 填充缺失值:使用
fillna()方法用指定值填充缺失值,比如用均值、中位数或者固定值填充。
下面是缺失值处理的示例代码:
# 识别缺失值
print("缺失值判断结果:")
print(df.isna())
# 删除包含缺失值的行
drop_na_df = df.dropna()
print("n删除缺失值后的数据:")
print(drop_na_df)
# 用0填充年龄列的缺失值,用未知填充城市列的缺失值
fill_df = df.copy()
fill_df["age"] = fill_df["age"].fillna(0)
fill_df["city"] = fill_df["city"].fillna("未知")
print("n填充缺失值后的数据:")
print(fill_df)
组合操作完整示例
实际场景中我们通常会将条件筛选、分组计数和缺失值处理组合使用,比如需求是:先删除年龄列的缺失值,再筛选出年龄大于18岁的用户,最后按照城市统计用户数量。
完整实现代码如下:
# 组合操作:处理缺失值-条件筛选-分组计数
# 第一步:删除年龄列的缺失值
step1_df = df.dropna(subset=["age"])
# 第二步:筛选年龄大于18岁的用户
step2_df = step1_df[step1_df["age"] > 18]
# 第三步:按照城市分组计数
result = step2_df.groupby("city").size()
print("组合操作最终结果:")
print(result)
通过这种链式操作的方式,我们可以清晰实现复杂的数据处理需求,同时保证每一步的逻辑可查,方便后续调试和维护。
注意事项
1. 条件筛选时如果存在多个条件,需要用括号包裹每个条件,并用&(与)、|(或)、~(非)连接,不能使用Python原生的and、or、not。
2. 分组计数时如果需要同时统计多个列的非缺失值数量,使用count方法更合适;如果只需要统计分组后的总行数,使用size方法效率更高。
3. 填充缺失值时要根据业务场景选择合适的填充值,避免填充不合理的值导致后续分析结果偏差。
常用方法对比
下面是条件筛选、分组计数、缺失值处理中常用方法的对比:
| 操作类型 | 常用方法 | 作用说明 |
|---|---|---|
| 条件筛选 | 布尔索引 | 根据指定条件提取符合条件的行 |
| 分组计数 | groupby + size/count | 按照指定维度统计分组后的数量 |
| 缺失值识别 | isna()/isnull() | 判断数据中的缺失值位置 |
| 缺失值过滤 | dropna() | 删除包含缺失值的行或列 |
| 缺失值填充 | fillna() | 用指定值填充缺失值 |