Excel数据处理详细文档02

数据排序

1.1 简单排序

手动操作:

  • 单列排序:选中列 → 数据 → 升序/降序
  • 快速排序:选中数据区域 → 数据 → 排序
  • 快捷键:Alt + D + S

Python操作(使用pandas):

python 复制代码
import pandas as pd

# 读取数据
df = pd.read_excel('数据.xlsx')

# 单列排序
df_sorted = df.sort_values('年龄')  # 升序
df_sorted = df.sort_values('年龄', ascending=False)  # 降序

# 保存结果
df_sorted.to_excel('排序结果.xlsx', index=False)

1.2 多列排序

手动操作:

  • 数据 → 排序 → 添加条件 → 设置主要关键字和次要关键字

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 多列排序
df_sorted = df.sort_values(
    by=['部门', '年龄'],
    ascending=[True, False]  # 部门升序,年龄降序
)

df_sorted.to_excel('多列排序.xlsx', index=False)

1.3 自定义排序

手动操作:

  • 数据 → 排序 → 自定义列表 → 添加自定义序列

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 自定义排序顺序
custom_order = ['总监', '经理', '主管', '员工']
df['职位'] = pd.Categorical(df['职位'], categories=custom_order, ordered=True)
df_sorted = df.sort_values('职位')

df_sorted.to_excel('自定义排序.xlsx', index=False)

1.4 按颜色排序

手动操作:

  • 数据 → 排序 → 排序依据 → 单元格颜色/字体颜色

Python操作:

python 复制代码
from openpyxl import load_workbook
from openpyxl.styles import PatternFill

wb = load_workbook('数据.xlsx')
ws = wb.active

# 按颜色标记数据
for row in ws.iter_rows(min_row=2, max_row=ws.max_row):
    if row[2].value > 30:  # 假设第3列是年龄
        row[0].fill = PatternFill(start_color='FFFF00', fill_type='solid')

wb.save('按颜色标记.xlsx')

数据筛选

2.1 自动筛选

手动操作:

  • 选中数据区域 → 数据 → 筛选
  • 快捷键:Ctrl + Shift + L
  • 点击列标题的下拉箭头 → 选择筛选条件

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 单条件筛选
df_filtered = df[df['年龄'] > 25]

# 多条件筛选(AND)
df_filtered = df[(df['年龄'] > 25) & (df['部门'] == '销售')]

# 多条件筛选(OR)
df_filtered = df[(df['年龄'] > 30) | (df['部门'] == '技术')]

# 包含筛选
df_filtered = df[df['姓名'].str.contains('张')]

# 不包含筛选
df_filtered = df[~df['姓名'].str.contains('张')]

df_filtered.to_excel('筛选结果.xlsx', index=False)

2.2 高级筛选

手动操作:

  • 数据 → 高级 → 设置条件区域和结果区域

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 复杂条件筛选
df_filtered = df[
    (df['年龄'].between(25, 35)) &
    (df['部门'].isin(['销售', '技术'])) &
    (df['工资'] >= 5000)
]

# 使用query方法(更简洁)
df_filtered = df.query('年龄 > 25 and 部门 == "销售"')

df_filtered.to_excel('高级筛选.xlsx', index=False)

2.3 按颜色筛选

手动操作:

  • 点击筛选下拉箭头 → 按颜色筛选 → 选择颜色

Python操作:

python 复制代码
from openpyxl import load_workbook

wb = load_workbook('数据.xlsx')
ws = wb.active

# 筛选特定颜色的单元格
yellow_rows = []
for idx, row in enumerate(ws.iter_rows(min_row=2, values_only=False), start=2):
    if row[0].fill.start_color.rgb == 'FFFFFF00':  # 黄色
        yellow_rows.append(idx)

print(f'黄色单元格所在行:{yellow_rows}')

2.4 文本筛选

手动操作:

  • 点击筛选下拉箭头 → 文本筛选 → 包含/不包含/开始于/结束于

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 包含特定文本
df_filtered = df[df['姓名'].str.contains('张')]

# 以特定文本开始
df_filtered = df[df['姓名'].str.startswith('张')]

# 以特定文本结束
df_filtered = df[df['姓名'].str.endswith('三')]

# 不包含特定文本
df_filtered = df[~df['姓名'].str.contains('张')]

# 正则表达式筛选
df_filtered = df[df['姓名'].str.match(r'^张.*')]

df_filtered.to_excel('文本筛选.xlsx', index=False)

2.5 数字筛选

手动操作:

  • 点击筛选下拉箭头 → 数字筛选 → 大于/小于/等于/介于

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 大于
df_filtered = df[df['年龄'] > 30]

# 小于
df_filtered = df[df['年龄'] < 25]

# 等于
df_filtered = df[df['年龄'] == 28]

# 介于
df_filtered = df[df['年龄'].between(25, 35)]

# 前N项
df_filtered = df.nlargest(10, '工资')

# 后N项
df_filtered = df.nsmallest(10, '工资')

df_filtered.to_excel('数字筛选.xlsx', index=False)

2.6 日期筛选

手动操作:

  • 点击筛选下拉箭头 → 日期筛选 → 选择日期范围

Python操作:

python 复制代码
import pandas as pd
from datetime import datetime, timedelta

df = pd.read_excel('数据.xlsx')

# 确保日期列是datetime类型
df['入职日期'] = pd.to_datetime(df['入职日期'])

# 特定日期
df_filtered = df[df['入职日期'] == '2024-01-01']

# 日期范围
start_date = datetime(2024, 1, 1)
end_date = datetime(2024, 12, 31)
df_filtered = df[(df['入职日期'] >= start_date) & (df['入职日期'] <= end_date)]

# 最近N天
days_ago = datetime.now() - timedelta(days=30)
df_filtered = df[df['入职日期'] >= days_ago]

# 特定年份
df_filtered = df[df['入职日期'].dt.year == 2024]

# 特定月份
df_filtered = df[df['入职日期'].dt.month == 6]

df_filtered.to_excel('日期筛选.xlsx', index=False)

数据分组与汇总

3.1 分类汇总

手动操作:

  • 先排序 → 数据 → 分类汇总 → 选择分组字段和汇总方式

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 按部门分组汇总
grouped = df.groupby('部门').agg({
    '工资': ['sum', 'mean', 'count'],
    '年龄': 'mean'
})

# 重命名列
grouped.columns = ['工资总和', '平均工资', '人数', '平均年龄']
grouped = grouped.reset_index()

grouped.to_excel('分组汇总.xlsx', index=False)

3.2 多级分组

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 多级分组
grouped = df.groupby(['部门', '职位']).agg({
    '工资': ['sum', 'mean', 'count'],
    '年龄': 'mean'
})

grouped.to_excel('多级分组.xlsx')

3.3 条件汇总

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 条件汇总
summary = df.groupby('部门').apply(
    lambda x: pd.Series({
        '总人数': len(x),
        '高薪人数': len(x[x['工资'] > 8000]),
        '平均工资': x['工资'].mean(),
        '最高工资': x['工资'].max(),
        '最低工资': x['工资'].min()
    })
)

summary.to_excel('条件汇总.xlsx')

3.4 交叉表

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 创建交叉表
crosstab = pd.crosstab(
    df['部门'],
    df['职位'],
    values=df['工资'],
    aggfunc='mean'
)

crosstab.to_excel('交叉表.xlsx')

# 多值交叉表
crosstab = pd.crosstab(
    [df['部门'], df['性别']],
    df['职位'],
    values=df['工资'],
    aggfunc=['mean', 'count']
)

crosstab.to_excel('多值交叉表.xlsx')

数据透视表

4.1 创建数据透视表

手动操作:

  • 选中数据区域 → 插入 → 数据透视表
  • 拖动字段到行、列、值区域

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 创建数据透视表
pivot = pd.pivot_table(
    df,
    values='工资',
    index='部门',
    columns='职位',
    aggfunc='mean',
    fill_value=0
)

pivot.to_excel('数据透视表.xlsx')

4.2 多值数据透视表

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 多个值字段
pivot = pd.pivot_table(
    df,
    values=['工资', '年龄'],
    index='部门',
    columns='职位',
    aggfunc={'工资': 'mean', '年龄': 'mean'},
    fill_value=0
)

pivot.to_excel('多值透视表.xlsx')

4.3 多级透视表

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 多级行和列
pivot = pd.pivot_table(
    df,
    values='工资',
    index=['部门', '职位'],
    columns=['性别', '学历'],
    aggfunc='mean',
    fill_value=0,
    margins=True,  # 添加总计
    margins_name='总计'
)

pivot.to_excel('多级透视表.xlsx')

4.4 透视表计算字段

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 创建透视表
pivot = pd.pivot_table(
    df,
    values=['工资', '奖金'],
    index='部门',
    aggfunc='sum'
)

# 添加计算字段
pivot['总收入'] = pivot['工资'] + pivot['奖金']
pivot['奖金比例'] = pivot['奖金'] / pivot['工资'] * 100

pivot.to_excel('计算字段透视表.xlsx')

4.5 使用openpyxl创建原生透视表

Python操作:

python 复制代码
from openpyxl import load_workbook
from openpyxl.pivot.table import TableDefinition, PivotTable
from openpyxl.pivot.fields import RowFields, ColFields, DataField

# 注意:openpyxl创建透视表较复杂,推荐使用pandas或xlwings
# 这里提供基本框架

wb = load_workbook('数据.xlsx')
ws = wb.active

# 定义数据源
data_range = f'A1:D{ws.max_row}'

# 创建透视表(需要详细配置)
# 实际使用中建议使用pandas或xlwings库

数据去重

5.1 删除重复项

手动操作:

  • 选中数据区域 → 数据 → 删除重复项
  • 选择要检查的列

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 删除完全重复的行
df_unique = df.drop_duplicates()

# 基于特定列删除重复
df_unique = df.drop_duplicates(subset=['姓名', '部门'])

# 保留最后一个重复项
df_unique = df.drop_duplicates(subset=['姓名'], keep='last')

# 标记重复项
df['是否重复'] = df.duplicated(subset=['姓名'])

df_unique.to_excel('去重结果.xlsx', index=False)

5.2 查找重复项

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 查找重复项
duplicates = df[df.duplicated(subset=['姓名'], keep=False)]

# 统计重复次数
duplicate_counts = df.groupby('姓名').size()
duplicate_counts = duplicate_counts[duplicate_counts > 1]

print('重复的姓名:')
print(duplicate_counts)

duplicates.to_excel('重复项.xlsx', index=False)

5.3 高级去重

Python操作:

python 复制代码
import pandas as pd

df = pd.read_excel('数据.xlsx')

# 基于多列组合去重
df_unique = df.drop_duplicates(subset=['姓名', '部门', '职位'])

# 保留特定条件的重复项(如保留工资最高的)
df_unique = df.sort_values('工资', ascending=False).drop_duplicates(subset=['姓名'])

# 模糊去重(基于相似度)
from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

# 查找相似的姓名
names = df['姓名'].unique()
similar_pairs = []
for i, name1 in enumerate(names):
    for name2 in names[i+1:]:
        if similar(name1, name2) > 0.8:  # 相似度阈值
            similar_pairs.append((name1, name2))

print('相似的姓名对:', similar_pairs)

df_unique.to_excel('高级去重.xlsx', index=False)

数据验证

6.1 设置数据验证

手动操作:

  • 选中单元格 → 数据 → 数据验证
  • 设置允许的数据类型和条件

验证类型:

  • 整数/小数:限制数值范围
  • 列表:下拉选择
  • 日期/时间:限制日期范围
  • 文本长度:限制字符数
  • 自定义:使用公式

Python操作(使用openpyxl):

python 复制代码
from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation

wb = Workbook()
ws = wb.active

# 整数验证
dv_int = DataValidation(
    type='whole',
    operator='between',
    formula1=1,
    formula2=100,
    showErrorMessage=True,
    errorTitle='输入错误',
    error='请输入1-100之间的整数'
)
ws.add_data_validation(dv_int)
dv_int.add('A1:A100')

# 列表验证(下拉框)
dv_list = DataValidation(
    type='list',
    formula1='"销售,技术,市场,人事"',
    showDropDown=True
)
ws.add_data_validation(dv_list)
dv_list.add('B1:B100')

# 日期验证
dv_date = DataValidation(
    type='date',
    operator='between',
    formula1='2024-01-01',
    formula2='2024-12-31'
)
ws.add_data_validation(dv_date)
dv_date.add('C1:C100')

# 文本长度验证
dv_text = DataValidation(
    type='textLength',
    operator='lessThanOrEqual',
    formula1=50,
    showErrorMessage=True,
    errorTitle='文本过长',
    error='文本长度不能超过50个字符'
)
ws.add_data_validation(dv_text)
dv_text.add('D1:D100')

wb.save('数据验证.xlsx')

6.2 自定义验证公式

手动操作:

  • 数据验证 → 自定义 → 输入公式

常用验证公式:

  • 不允许重复:=COUNTIF($A$1:$A$100,A1)=1
  • 必须大于另一列:=A1>B1
  • 只允许邮箱格式:=AND(FIND("@",A1)>0,FIND(".",A1)>0)

Python操作:

python 复制代码
from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation

wb = Workbook()
ws = wb.active

# 自定义公式验证
dv_custom = DataValidation(
    type='custom',
    formula1='=AND(LEN(A1)>=6, LEN(A1)<=20)',
    showErrorMessage=True,
    errorTitle='格式错误',
    error='密码长度必须在6-20个字符之间'
)
ws.add_data_validation(dv_custom)
dv_custom.add('A1:A100')

wb.save('自定义验证.xlsx')

6.3 输入提示

Python操作:

python 复制代码
from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation

wb = Workbook()
ws = wb.active

# 添加输入提示
dv = DataValidation(
    type='list',
    formula1='"选项1,选项2,选项3"',
    showInputMessage=True,
    promptTitle='请选择',
    prompt='请从下拉列表中选择一个选项'
)
ws.add_data_validation(dv)
dv.add('A1:A100')

wb.save('输入提示.xlsx')

6.4 数据验证实战示例

Python操作:

python 复制代码
from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation

wb = Workbook()
ws = wb.active

# 设置表头
headers = ['姓名', '年龄', '部门', '入职日期', '邮箱']
ws.append(headers)

# 姓名验证(2-10个字符)
dv_name = DataValidation(
    type='textLength',
    operator='between',
    formula1=2,
    formula2=10,
    showErrorMessage=True,
    error='姓名长度必须在2-10个字符之间'
)
ws.add_data_validation(dv_name)
dv_name.add('A2:A1000')

# 年龄验证(18-65岁)
dv_age = DataValidation(
    type='whole',
    operator='between',
    formula1=18,
    formula2=65,
    showErrorMessage=True,
    error='年龄必须在18-65岁之间'
)
ws.add_data_validation(dv_age)
dv_age.add('B2:B1000')

# 部门验证(下拉列表)
dv_dept = DataValidation(
    type='list',
    formula1='"销售部,技术部,市场部,人事部,财务部"',
    showDropDown=True
)
ws.add_data_validation(dv_dept)
dv_dept.add('C2:C1000')

# 日期验证(2020-2025年)
dv_date = DataValidation(
    type='date',
    operator='between',
    formula1='2020-01-01',
    formula2='2025-12-31',
    showErrorMessage=True,
    error='入职日期必须在2020-2025年之间'
)
ws.add_data_validation(dv_date)
dv_date.add('D2:D1000')

# 邮箱验证(自定义公式)
dv_email = DataValidation(
    type='custom',
    formula1='=AND(ISNUMBER(FIND("@",E2)),ISNUMBER(FIND(".",E2)))',
    showErrorMessage=True,
    error='请输入有效的邮箱地址'
)
ws.add_data_validation(dv_email)
dv_email.add('E2:E1000')

wb.save('员工信息表_带验证.xlsx')
相关推荐
CircleMouse11 小时前
如何设置wps单元格下拉选项设置
excel·wps
zhangjin122216 小时前
kettle插件-excel插件,kettle读取excel动态表头,kettle根据列名读取excel
excel·kettle·kettle excel插件·kettle 动态excel
远洪1 天前
excel 找出两列不同的数据
excel
pcplayer1 天前
非常好用的 Excel 读写控件
excel·delphi·office
Navicat中国1 天前
使用 Navicat 导入向导导入 Excel 数据时,系统提示导入成功,表中也能看到数据,但行数统计显示为 0,这是什么原因?
数据库·excel·导入
穿着内裤的外星人2 天前
触控精灵远程读写Excel步骤配置
excel
是孑然呀2 天前
【小记】excel vlookup一对多(第二篇)
excel
开开心心就好2 天前
专为视障人士设计的免费辅助工具
windows·计算机视觉·计算机外设·excel·散列表·推荐算法·csdn开发云
transformer_WSZ2 天前
excel两列数据绘制折线图
excel·折线图
蒋胜山2 天前
Excel 练习题(5)
经验分享·excel