Excel – pandas

数据结构 维度 用途
Series 一维 单列数据,类似Excel的一列
DataFrame 二维 表格数据,由多列Series组成
Python List 一维 基础列表,无标签

读取表格

import pandas as pd
drug_excel = "./20260327-神经精神类位点.xlsx"
df = pd.read_excel(drug_excel)  # 注意,此时读取的默认sheet_name=0,即第一个表,返回 DataFrame,键为表头

# 不读入表数据,只获得所有工作表名称,推荐使用
df_e = pd.ExcelFile(drug_excel)    # 这一步只是建立连接,没有读取数据
sheet_names = df_e.sheet_names

# 获取所有工作表名称(实际读入了全部表数据)
df = pd.read_excel(drug_excel, sheet_name=None)  # 读取所有工作表,返回字典(键为工作表名,值为对应数据)
sheet_names = list(df.keys())

for sheet_name in sheet_names:
    # 获取工作表数据,已经全部读入为字典了,所以直接取sheet_name作为键取表内容
    sheet_data = df[sheet_name]
    # 获取工作表数据,复用已打开的连接,可按需读取,内存占用低
    df = pd.read_excel(xl, sheet_name=sheet_name)

可用参数

  • sheet_name="sheet1"​默认为0(索引,第一张表格),读取指定sheet表,可以是列表用于读取多个sheet表,['Sheet1', 'Sheet2']
  • header=指定表头所在行
  • skiprows=跳过指定行,可以是列表形式跳过多个行

遍历输出

for idx, row in df.iterrows():
    print(f'{row.iloc[0]}\t{row.iloc[1]}\n')

查看表格

print(df.head())  # 查看前5行
print(df.shape)  # 查看规模

数据清洗

在 Pandas 中,Series​(即 DataFrame 的列)不能直接调用 Python 原生字符串的方法(如 .lower()​、.strip()​)。每一次对 Series 进行字符串操作,都必须通过 .str 访问器来委托给内部的字符串处理方法

在 Pandas 的底层设计中,.str​ 被称为 String Accessor(字符串访问器) 。它的作用就是桥接:把 Python 原生的字符串方法(如 lower​, upper​, strip​, replace),批量应用到 Series 的每一个单元格中。

方法 作用 示例
.str.lower()​/.str.upper() 转小写 / 转大写 s.str.lower()
.str.strip() 去除首尾空格 s.str.strip()
.str.replace('a', 'b') 替换字符 s.str.replace('Rs', 'rs')
.str.contains('pattern') 非常常用:判断是否包含某字符(支持正则) s.str.contains('rs123')
.str.split(',') 按字符分割,返回由列表组成的 Series s.str.split(',')
.str.len() 计算每个字符串的长度 s.str.len()
import pandas as pd

df = pd.read_excel('原始数据.xlsx')
# 删除重复行
df = df.drop_duplicates()

# 填充空值
df['销售额'] = df['销售额'].fillna(0)

# 筛选符合条件的行
df = df[df['销售额'] > 1000]
filtered_df = df[(df['class'] == 'snp') & (df['test_disease'] != 'General')]

# 特定列的清洗
sheet_data = df[sheet_name]
snp_list = sheet_data["SNP"]  # 读取snp列信息

snp_list = snp_list.astype(str)  # 转换为字符串类型
snp_list = snp_list.str.strip()  # 去除空格
snp_list = snp_list.str.lower()  # 转换为小写
snp_list = snp_list.dropna()    # 删除空值
snp_list = snp_list.drop_duplicates()   # 删除重复值

# 建议写成链式,更省内存
snp_list = snp_list.astype(str).str.strip().str.lower().dropna().drop_duplicates().nunique()

# 按条件分组汇总
summary = df.groupby('部门')['销售额'].sum().reset_index()

# 保存结果
summary.to_excel('清洗后数据.xlsx', index=False)
print("数据清洗完成!")

写入数据

import pandas as pd

# 模拟处理后的数据
data = {
    '姓名': ['张三', '李四', '王五'],
    '销售额': [10000, 25000, 18000],
    '提成': [1000, 2500, 1800]
}
df = pd.DataFrame(data)

# 保存到Excel
df.to_excel('员工提成表.xlsx', index=False, sheet_name='提成明细')
print("保存成功!")

# 写入多个sheet表
with pd.ExcelWriter('汇总表.xlsx') as writer:
    df1.to_excel(writer, sheet_name='1月', index=False)  # index,是否保存索引
    df2.to_excel(writer, sheet_name='2月', index=False)

统计

# 假设你有一堆Excel文件,需要统计每个文件的销售总额
import pandas as pd
import osfrom pathlib
import Path

# 获取当前目录下所有xlsx文件
files = list(Path('.').glob('*.xlsx'))
results = []

for file in files:
    try:
        df = pd.read_excel(file)
        # 假设销售额列名叫"销售额"
        total = df['销售额'].sum()
        results.append({'文件名': file.name,'销售总额': total})
        print(f" {file.name} 处理完成,总额: {total}")
    except Exception as e:
        print(f" {file.name} 处理失败: {e}")

# 汇总结果保存
result_df = pd.DataFrame(results)
result_df.to_excel('汇总结果.xlsx', index=False)

print("\n 全部处理完成!汇总结果已保存")

美化

import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment

# 先用pandas处理数据
df = pd.read_excel('销售数据.xlsx')
df.to_excel('处理后.xlsx', index=False)

# 用openpyxl设置格式
wb = load_workbook('处理后.xlsx')
ws = wb.active

# 设置表头样式 - 蓝色背景加白字
header_fill = PatternFill(start_color='4472C4',
                          end_color='4472C4',
                          fill_type='solid')
header_font = Font(bold=True, color='FFFFFF')

for cell in ws[1]:
    # 第一行是表头
    cell.fill = header_fill
    cell.font = header_font
    cell.alignment = Alignment(horizontal='center')

    # 自动调整列宽
    for column in ws.columns:
        max_length = 0
        column_letter = column[0].column_letter
        for cell in column:
            try:
                if len(str(cell.value)) > max_length:
                    max_length = len(str(cell.value))
            except:
                pass

        adjusted_width = (max_length + 2) * 1.2
        ws.column_dimensions[column_letter].width = adjusted_width

wb.save('格式化后.xlsx')
print("格式设置完成,文件已保存!")

文章摘自:https://www.cnblogs.com/gwl9505/p/21174387/excel-pandas-z1ee85n