数据排序
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')