| 数据结构 | 维度 | 用途 |
|---|---|---|
| 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
