
在数据分析领域,从大型数据集中提取特定信息是常见的任务。这通常涉及两个核心操作:首先,根据某个或多个条件筛选出符合要求的行;其次,对筛选后的数据进行分组,并计算每个组的统计量,例如计数、平均值或总和。本文将以一个具体的场景为例,详细阐述如何利用python的pandas库高效地完成这些操作,特别是当条件涉及到缺失值(nan)时。
首先,我们需要一个示例数据集来演示操作。假设我们有一个包含地理空间、时间维度和数值的数据集,其中部分数值可能为缺失值。为了便于演示,我们将创建一个模拟的CSV文件并加载它。
示例数据 (space.csv):
Id,SpatialDimType,SpatialDim,TimeDim,Value,NumericValue,Low,High 32256659,COUNTRY,AND,2022,No data,,, 32256659,COUNTRY,AND,2022,No data,,, 32256659,COUNTRY,AND,2023,No data,,, 32256661,COUNTRY,ATG,2022,No data,,, 32256664,COUNTRY,AUS,2001,No data,,, 32256664,COUNTRY,AUS,2001,No data,,, 32256664,COUNTRY,AUS,2001,No data,,, 32256664,COUNTRY,AUS,2004,No data,,, 32256664,COUNTRY,AUS,2004,No data,,, 32256665,COUNTRY,AUT,2004,No data,,,
使用Pandas加载数据:
import pandas as pd
# 假设 space.csv 文件已存在于当前目录
df = pd.read_csv('./space.csv', sep=',')
print("原始DataFrame:")
print(df)
print("\n")我们的目标是找出 NumericValue 列为缺失值(NaN)的所有记录。Pandas提供了 isna() 方法来方便地检测缺失值。
# 筛选 NumericValue 列为 NaN 的行
df_filtered = df[df['NumericValue'].isna()]
print("筛选后DataFrame (NumericValue为NaN的行):")
print(df_filtered)
print("\n")df['NumericValue'].isna() 会返回一个布尔型Series,其中 NumericValue 为NaN的对应位置为 True,否则为 False。将这个布尔Series作为索引传递给DataFrame,即可筛选出满足条件的行。
在筛选出 NumericValue 为NaN的行之后,我们需要根据 SpatialDim 和 TimeDim 这两列进行分组,并计算每个组的记录数量。
Pandas的 groupby() 方法用于分组,然后可以使用 size() 或 count() 进行聚合。
# 对筛选后的数据按 SpatialDim 和 TimeDim 分组,并计算每组的数量
# .size() 返回一个Series,其索引是分组键
# .reset_index(name='count') 将索引转换为列,并给计数列命名为 'count'
result_df = df_filtered.groupby(
by=['SpatialDim', 'TimeDim']
).size().reset_index(name='count')
print("最终结果 (SpatialDim, TimeDim 组合的计数):")
print(result_df)完整示例代码:
将上述步骤整合到一起,得到最终的解决方案代码:
import pandas as pd
# 假设 space.csv 文件已存在于当前目录
# 如果没有,可以手动创建或使用以下数据
# data = {
# 'Id': [32256659, 32256659, 32256659, 32256661, 32256664, 32256664, 32256664, 32256664, 32256664, 32256665],
# 'SpatialDimType': ['COUNTRY']*10,
# 'SpatialDim': ['AND', 'AND', 'AND', 'ATG', 'AUS', 'AUS', 'AUS', 'AUS', 'AUS', 'AUT'],
# 'TimeDim': [2022, 2022, 2023, 2022, 2001, 2001, 2001, 2004, 2004, 2004],
# 'Value': ['No data']*10,
# 'NumericValue': [float('nan')]*10, # 模拟所有NumericValue为NaN
# 'Low': ['']*10,
# 'High': ['']*10
# }
# df = pd.DataFrame(data)
df = pd.read_csv('./space.csv', sep=',')
# 1. 筛选 NumericValue 列为 NaN 的行
# 2. 对筛选后的数据按 SpatialDim 和 TimeDim 分组
# 3. 使用 .size() 计算每个组的行数
# 4. 使用 .reset_index(name='count') 将结果转换为DataFrame,并重命名计数列
df_result = df[df['NumericValue'].isna()].groupby(
by=['SpatialDim', 'TimeDim']
).size().reset_index(name='count')
print(df_result)运行结果:
SpatialDim TimeDim count 0 AND 2022 2 1 AND 2023 1 2 ATG 2022 1 3 AUS 2001 3 4 AUS 2004 2 5 AUT 2004 1
通过本教程,我们学习了如何利用Pandas库进行高效的数据筛选和分组聚合。关键步骤包括使用 isna() 进行缺失值条件筛选,以及利用 groupby() 结合 size() 进行分组计数。这种组合操作在数据清洗、探索性数据分析和生成汇总报告中非常常见且实用,是每个数据分析师和科学家必备的技能。掌握这些技术将大大提高处理和理解数据的能力。
以上就是使用Pandas进行条件筛选与分组计数:以NaN值处理为例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号