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')
相关推荐
开开心心就好3 小时前
OCR识别工具可加AI接口,快捷键截图翻译便捷
java·网络·windows·随机森林·电脑·excel·推荐算法
jiayong236 小时前
Excel基础操作详细文档01
excel
伟贤AI之路11 小时前
原创分享:Markdown 表格导出 Excel/Json - 方便数据处理分析
json·excel·markdown
jiayong2312 小时前
Excel自动化操作详细文档04
运维·自动化·excel
jiayong2313 小时前
Excel高级功能详细文档03
excel
Channing Lewis1 天前
Python读取excel转成html,并且复制excel中单元格的颜色(字体或填充)
python·html·excel
醉卧考场君莫笑1 天前
excel数据统计与数据可视化
信息可视化·excel
weixin_440401691 天前
WPS Excel 宏使用
excel··wps
GalenZhang8881 天前
Excel/WPS 表格数据合并操作指南
excel·wps