python利用pandas筛选xlsx文件

写在前面

excel数据本质就是一个二维数组,可以用二维数组思想理解pandas,不是专业的是,所以不写太多pandas的文字说明,只举例子

常用函数

导入pandas

import pandas as pd

读取文件

# 读取文件
filename = '中央机关及其直属机构2026年度补充录用公务员职位表.xlsx'
header = 1  # 第二行才是真正的数据,第一行是表头,从第二行开始读取
df = pd.read_excel(filename, header=header)

header参数表示从第几行开始为列名,索引从0开始,例如测试文件.xlsx列名是第2行,则传入header=1

image-20260511202400416

查看数据

查看行数和列数

# 查看行数和列数
shape = df.shape
print(f"⭐️共:{shape[0]}行,{shape[1]}列")

查看概述信息

info = df.info
print("⭐️概述信息如下:")
print(info)

会打印大概信息,如下表示927行30列数据

所有的print都一样,不会显示具体数据,因为数据太多了,只会缩略显示

image-20260511202829680

查看前N行数据

n = 5
head = df.head(n)
print(f"⭐️前{n}行数据如下:")
print(head)

如下,只是显示缩略数据

image-20260511205445587

查看后N行数据

n = 5
head = df.tail(n)
print(f"⭐️后{n}行数据如下:")
print(head)

查看列名

columns = df.columns
print(f"⭐️列名如下:{columns}")

查看列缺失值的情况

打印出某一列共多少个缺失值,即有多少个空数据,表格中为"空"
如果数据为"0",并不会认为是"空"值
比如 "考生咨询电话二 570"
表示 考生咨询电话二 这一列有570行都是空值

count = df.isnull().sum()
print("⭐️缺失值情况如下:")
print(count)

如下图,对照xlsx文件可以理解明白:

备注这一列,有36行没有数据,是空值

专业科目分数线这一列,有840行没有数据,是空值

image-20260511203447695

删除含缺失值的行

一般对数据进行筛选之前,有空值的话会影响结果

或者根本不关心有空值的行,这时候就把这些行先删除

例如:班上某个人没来考数学,则数学成绩为空值,要求全班数学平均分,则要先删除这个同学的这一行, 不然Nan无法参与运算

只要某一行中有"空"值,就会删除掉此行

drop_na = df.dropna()
# 保存文件
index = False  # 保存文件时不要自动生成的行号
drop_na.to_excel("删除含缺失值的行.xlsx", index=index)

只有某一行中所有值都是"空"值,才会删除此行

当这一行都没数据时,删除该行

drop_na_all = df.dropna(how='all')
# 保存文件
drop_na_all.to_excel("删除整行都是空值的行.xlsx", index=index)

只删除某一列有空值的行

专业科目分数线没有数据时,删除该行

# 只有subset列的数据为空,才删除该行
subset = ['专业科目分数线']
drop_na_subset = df.dropna(subset=subset)
# 保存文件
drop_na_subset.to_excel("删除subset列是空值的行.xlsx", index=index)

删除多列中任何一列有空值的行

这里是"或"关系subset列表中某一列有空值,就删除该行

专业科目分数线是空值或者是考生咨询电话二空值时,删除该行

subset = ['专业科目分数线', '考生咨询电话二']
drop_na_subset2 = df.dropna(subset=subset)
# 保存文件
drop_na_subset2.to_excel("删除subset列或关系是空值的行.xlsx", index=index)

筛选

筛选某一列

直接看有哪些用人司局

key = '用人司局'
columns = df[key]
print(f"⭐️关键字:{key}, 对应的数据如下:")
print(columns)

筛选某些列

直接看有哪些用人司局以及对应的机构性质

key = ['用人司局', '机构性质']
columns = df[key]
print(f"⭐️关键字:{key}, 对应的数据如下:")
print(columns)

筛选某一列==某个值的所有行

查找部门名称国务院发展研究中心的所有行

key = '部门名称'
value = '国务院发展研究中心'
filter_df = df[df[key] == value]
print(f"⭐️筛选key'{key}'==value'{value}'的所有行如下:")
print(filter_df)
filter_df.to_excel("筛选某一列是某个的所有行.xlsx", index=index)

筛选某一列==某些值的所有行

查找部门名称国务院发展研究中心或者中国老龄协会的所有行

values = ['国务院发展研究中心', '中国老龄协会']
filter_df = df[df[key].isin(values)]
print(f"⭐️筛选key'{key}'在某些值values'{values}'的所有行如下:")
print(filter_df)
filter_df.to_excel("筛选某一列是某些值的所有行.xlsx", index=index)

筛选某一列!=某个值的所有行

查找政治面貌不是不限的所有行

key = '政治面貌'
value = '不限'
filter_df = df[df[key] != value]
print(f"⭐️筛选key'{key}'!=value'{value}'的所有行如下:")
print(filter_df)
filter_df.to_excel("筛选某一列不是某个的所有行.xlsx", index=index)

筛选多个条件

"与"条件用"&"连接

"或"条件用"|"连接

多个条件 用"()"括起来

举例:

筛选专业名称里带有计算机三个字或者不限,并且学历不属于硕士研究生及以上仅限硕士研究生

filter_df = df[(df['专业'].str.contains("计算机", na=False) |
                df['专业'].str.contains("不限", na=False) |
                df['专业'].isnull())
               & (~df['学历'].isin(['硕士研究生及以上', '仅限硕士研究生']))]
print(f"⭐️筛选与条件的所有行如下:")
print(filter_df)
filter_df.to_excel("筛选与条件.xlsx", index=index)

解析:

1、~表示取反,后面是isin,反过来就是not isin 不包含的意思

2、na=False 本意是有空值的这一行不要了,把这一行设置为False,筛选时就会剔除。但是加上.isnull()表示空值这一行也要;二者看似矛盾,其实是防止有空值时,程序在.str.contains这一行报错,例如 ValueError: Cannot mask with non-boolean array containing NA / NaN values。这样就实现了有空值不报错,且空值也要;当然也可以 df['专业'].str.contains("计算机", na=True) 而不要.isnull()

3、既然 na=True 这么简洁,为什么大家平时更常用 na=False 呢?这主要是出于编程习惯和语义的直观性:在绝大多数筛选场景下,当我们用 str.contains 查找某个关键词(比如“计算机”)时,潜意识里认为“空值”是不包含这个关键词的,所以用 na=False(空值 = 不匹配)更符合直觉。如果后续业务需要保留空行,再显式地加上 | df['专业'].isnull(),代码的逻辑会显得非常透明,别人一眼就能看懂:“哦,这里是要把空值也带上”。而 na=True 虽然代码短,但在语义上稍微有点“反直觉”(空值明明没有“计算机”三个字,却被标记为匹配)。

分组

# 分组
name = "报考岗位代码"
filter_df = df.groupby(name)
print(f"⭐️根据{name}分组, 数据如下:")
# 遍历查看每个分组
for name, group in filter_df:
    # 查看各组的最高分
    max_score = group['总成绩'].max()
    print(f" 组名:{name}, 最高分:{max_score}")
    print(group)
    print("-" * 20)

例子

image-20260511205958385

代码

# -*- coding: utf-8 -*-
"""
File Name: main.py
Author: DellUser
Date: 2026/5/11
"""
import pandas as pd


def main():
    # 读取文件
    filename = '中央机关及其直属机构2026年度补充录用公务员职位表.xlsx'
    header = 1  # 第二行才是真正的数据,第一行是表头,从第二行开始读取
    df = pd.read_excel(filename, header=header)

    # 查看行数和列数
    shape = df.shape
    print(f"⭐️共:{shape[0]}行,{shape[1]}列")

    # 查看概述信息
    print("⭐️概述信息如下:")
    print(df.info())

    # 查看前N行数据
    n = 5
    head = df.head(n)
    print(f"⭐️前{n}行数据如下:")
    print(head)

    # 查看后N行数据
    n = 5
    head = df.tail(n)
    print(f"⭐️后{n}行数据如下:")
    print(head)

    # 查看列名
    columns = df.columns
    print(f"⭐️列名如下:{columns}")

    # 查看列缺失值的情况
    # 打印出某一列共多少个缺失值,即有多少个没数据,表格中为"空"
    # 如果数据为"0",并不会认为是"空"值
    # 比如 "考生咨询电话二            570"
    # 表示 考生咨询电话二 这一列有570行都是空值
    count = df.isnull().sum()
    print("⭐️缺失值情况如下:")
    print(count)

    # 删除含缺失值的行
    # 只要某一行中有"空"值,就会删除掉此行
    drop_na = df.dropna()
    # 保存文件
    index = False  # 保存文件时不要自动生成的行号
    drop_na.to_excel("删除含缺失值的行.xlsx", index=index)

    # 只有某一行中所有值都是"空"值,才会删除此行
    drop_na_all = df.dropna(how='all')
    # 保存文件
    drop_na_all.to_excel("删除整行都是空值的行.xlsx", index=index)

    # 只删除某一列有空值的行
    # 只有subset列的数据为空,才删除该行
    subset = ['专业科目分数线']
    drop_na_subset = df.dropna(subset=subset)
    # 保存文件
    drop_na_subset.to_excel("删除subset列是空值的行.xlsx", index=index)

    # 删除subset中任何一列有空值的行
    # 这里是"或"关系 即subset列表中某一列有空值,就删除该行
    subset = ['专业科目分数线', '考生咨询电话二']
    drop_na_subset2 = df.dropna(subset=subset)
    # 保存文件
    drop_na_subset2.to_excel("删除subset列或关系是空值的行.xlsx", index=index)

    # 筛选某一列
    key = '用人司局'
    columns = df[key]
    print(f"⭐️关键字:{key}, 对应的数据如下:")
    print(columns)

    # 筛选某些列
    key = ['用人司局', '机构性质']
    columns = df[key]
    print(f"⭐️关键字:{key}, 对应的数据如下:")
    print(columns)

    # 筛选某一列==某个值的所有行
    key = '部门名称'
    value = '国务院发展研究中心'
    filter_df = df[df[key] == value]
    print(f"⭐️筛选key'{key}'==value'{value}'的所有行如下:")
    print(filter_df)
    filter_df.to_excel("筛选某一列是某个的所有行.xlsx", index=index)

    # 筛选某一列==某些值的所有行
    values = ['国务院发展研究中心', '中国老龄协会']
    filter_df = df[df[key].isin(values)]
    print(f"⭐️筛选key'{key}'在某些值values'{values}'的所有行如下:")
    print(filter_df)
    filter_df.to_excel("筛选某一列是某些值的所有行.xlsx", index=index)

    # 筛选某一列!=某个值的所有行
    key = '政治面貌'
    value = '不限'
    filter_df = df[df[key] != value]
    print(f"⭐️筛选key'{key}'!=value'{value}'的所有行如下:")
    print(filter_df)
    filter_df.to_excel("筛选某一列不是某个的所有行.xlsx", index=index)

    # 提前把专业和学历列的前后空格去掉
    df['专业'] = df['专业'].astype(str).str.strip()
    df['学历'] = df['学历'].astype(str).str.strip()

    # "与"条件 "或"条件
    # "与"条件用"&"连接
    # "或"条件用"|"连接
    # 多个条件 用"()"括起来
    # 筛选专业名称里带有"计算机"三个字或者"不限"
    # 并且学历不属于"硕士研究生及以上"或"仅限硕士研究生"
    # na=False 本意是有空值的这一行不要了,把这一行设置为False,筛选时就会剔除
    # 但是加上.isnull()表示空值这一行也要
    # 二者看似矛盾,其实是防止有空值时,程序在.str.contains这一行报错
    # 例如 ValueError: Cannot mask with non-boolean array containing NA / NaN values
    # 这样就实现了有空值不报错,且空值也要
    # 当然也可以 df['专业'].str.contains("计算机", na=True) 而不要.isnull()
    # 既然 na=True 这么简洁,为什么大家平时更常用 na=False 呢?
    # 这主要是出于编程习惯和语义的直观性:
    # 在绝大多数筛选场景下,当我们用 str.contains 查找某个关键词(比如“计算机”)时,
    # 潜意识里认为“空值”是不包含这个关键词的,所以用 na=False(空值 = 不匹配)更符合直觉。
    # 如果后续业务需要保留空行,再显式地加上 | df['专业'].isnull(),
    # 代码的逻辑会显得非常透明,别人一眼就能看懂:“哦,这里是要把空值也带上”。
    # 而 na=True 虽然代码短,但在语义上稍微有点“反直觉”
    # (空值明明没有“计算机”三个字,却被标记为匹配)。
    filter_df = df[(df['专业'].str.contains("计算机", na=False) |
                    df['专业'].str.contains("不限", na=False) |
                    df['专业'].isnull())
                   & (~df['学历'].isin(['硕士研究生及以上', '仅限硕士研究生']))]
    print(f"⭐️筛选与条件的所有行如下:")
    print(filter_df)
    filter_df.to_excel("筛选与条件.xlsx", index=index)

    # 读取文件
    filename = '红河州2026年事业单位公开招聘工作人员笔试成绩.xlsx'
    header = 0
    df = pd.read_excel(filename, header=header)

    # 分组
    name = "报考岗位代码"
    filter_df = df.groupby(name)
    print(f"⭐️根据{name}分组, 数据如下:")
    # 遍历查看每个分组
    for name, group in filter_df:
        # 查看各组的最高分
        max_score = group['总成绩'].max()
        print(f" 组名:{name}, 最高分:{max_score}")
        print(group)
        print("-" * 20)


if __name__ == "__main__":
    main()

gitee url

python-learning-notes: 这里是我的Python学习小仓库~ 装着我练手的各种代码:读Excel、发请求、处理数据…… 按不同库建了文件夹,边学边记,慢慢积累✨

posted @ 2026-05-11 21:03  南风丶轻语  阅读(37)  评论(0)    收藏  举报