【Python】pandas与Excel⽂件结合操作⼿册python怎么读入excel
pandas与Excel⽂件结合操作⼿册
Date: 2021.04.01
Author: jwensh
关键词: python pandas excel
⽂章⽬录
1. 关于 pandas 会使⽤的依赖
1.1 Excel writer engines
Deprecated since version 1.2.0: As the package is no longer maintained, the xlwt engine will be removed from a future version of pandas. This is the only engine in pandas that supports writing to .xls files.
pandas通过两种⽅法选择Excel书写器:
1. engine关键字参数
2. ⽂件名扩展名(通过配置选项中的默认指定)
要指定要使⽤的编写器,可以将引擎关键字参数传递给to_excel和ExcelWriter。内置引擎为:
默认情况下, pandas 使⽤ 处理 .xlsx, 处理 .xlsm, 和 处理 .xls ⽂件.如果你安装了多个引擎, 则可以通过 io.excel.xlsx.writer 和
要指定要使⽤的writer, 可以将引擎关键字参数传递给to_excel和ExcelWriter。内置引擎有:
openpyxl: version 2.4 or higher is required 模块openpyxl源于PHPExcel,它提供了针对.xlsx⽂件的读写功能
xlsxwriter
xlwt (模块xlrd能⽤来析取.xls和.xlsx⽂件中的数据)
1.2 ⽰例
先来⽣成⽤于填充 pandas 中DataFrame的随机数,然后⽤这个DataFrame创建⼀个Excel⽂件,接着再⽤Excel⽂件重建DataFrame,并通过mean()⽅法来计算其平均值。对于Excel⽂件的⼯作表,我们既可以为其指定⼀个从0开始计数的索引,也可以为其规定⼀个名称。
import numpy as np
import pandas as pd
from tempfile import NamedTemporaryFile
np.random.seed(42)
a = np.random.randn(365,4)
tmpf = NamedTemporaryFile(suffix='.xlsx')
df = pd.DataFrame(a)
print tmpf.name
<_excel(tmpf.name,sheet_name='Random Data')
print"Means\n", pd.read_excel(tmpf.name,'Random Data').mean()
通过to_excel()⽅法创建Excel⽂件,具体如下:
<_excel(tmpf.name,sheet_name='Random Data') 将DataFrame⾥的内容写⼊tmpf.name⾥,并把表取名为Random Data 下⾯使⽤顶级read_excel()函数来重建DataFrame,代码如下:
print "Means\n", pd.read_excel(tmpf.name, 'Random Data').mean() 读取tmpf.name⾥的Random Data表,并求每列的平均值
2. 理解to_excel操作
df = pandas.DataFrame()
<_excel()
2.1 DataFrame作⽤
Two-dimensional, size-mutable, potentially heterogeneous tabular data.
⼆维、⼤⼩可变、潜在异构的表格数据。
可理解为内存中的⼀个可以操作的数据表格,且能够像操作excel表格那样的简单,有很多功能。⽐较常⽤的:就是表格的数据更新、统计、筛选等等。 可以通过源码或者官⽅问题,来查看pandas.DataFrame()的相关参数,去看他是怎么实现的。
2.2 to_excel 操作
这个是 NDFrame 类的⽅法,DataFrame 类继承了class DataFrame(NDFrame, OpsMixin) ,所以 df 能直接使⽤;从源码上能看
出,to_excel ⽅法⾥⾯会⽤到⼀个 ExcelWriter 对象来实现写出的功能,⽽它底层有个需要,需要根据安装的依赖来选择使⽤那个。
没有writer的情况下:
<_excel("./data.xlsx")
有writer的请求下:
writer = pd.ExcelWriter(os.path.join(ios_inspection_excel_file,'.xlsx'),engine='xlsxwriter')
<_excel(writer, sheet_name='Sheet1') # 注意
worksheet = writer.sheets['Sheet1']
writer.save()
注意:to_excel ⽅法⾥⾯有个判断,当你给他传 ExcelWriter 对象的时候,他就不⾃⾏保存操作了,⽽是交给writer
if isinstance(writer, ExcelWriter):
need_save = False
else:
# pandas\io\formats\excel.py:808: error: Cannot instantiate
# abstract class 'ExcelWriter' with abstract attributes 'engine',
# 'save', 'supported_extensions' and 'write_cells' [abstract]
writer = ExcelWriter( # type: ignore[abstract]
writer, engine=engine, storage_options=storage_options
)
need_save = True
3. 数据的删除、增加、更新
已有⼀个DataFrame 对象的情况下,且有表格数据
id姓名性别⾝⾼
1aa男122
2bb⼥160
3.1 删除操作
def drop(
self,
labels=None,
axis=0,
index=None,
columns=None,
level=None,
inplace=False,
errors="raise",
)
注意:输出是要在原表格删除,还是要⽣成副本操作,使⽤ inplace 参数来关注, false 的时候 返回副本,true 的时候 直接修改原表格。
根据 索引 删除 df1 = df.drop([0]) 删除第 0 ⾏(header 不算在内)
df1 = df1.drop(['姓名'],axis=1), 删除姓名那⼀列列
过滤删除⾏ (返回⼀个副本): 这⾥使⽤的是全等于
df = df[df['⾝⾼'].isin([160])]# 选取出⾝⾼等于160 的⾏
df = df[~df['⾝⾼'].isin([160])]# 取反,得到⾝⾼不等于160的⾏
过滤删除列
cols=[x for i,x in lumns)if df.iat[0,i]=='男']# 遍历出有男这个值的列
df.drop(cols,axis=1)
还有很多其他的⽤法,可以去官⽹查看
3.2 增加操作
根据索引增加⼀⾏记录 df.loc[2] = [3, 'cc', '男', 180] 需要区别(df.iloc 按位置选择)
df.loc 先⽤loc到要更改的值,再⽤赋值(=)的⽅法实现更换值
df.iloc ⽤索引位置来查
两个可以更换单⾏、单列、多⾏、多列的值
追加⽅式 df.append() (⽐上⾯的⽅式稍快些,还可以避免index的错误)
s = pd.Series({'id':4,'姓名':'DD','⾝⾼':150})
# 这⾥ Series 必须是 dict-like 类型
df = df.append(s, ignore_index=True)
# 这⾥必须选择ignore_index=True 或者给 Series ⼀个index值
# 也可以直接填写字典格式进去
df = df.append({'id':4,'姓名':'DD','⾝⾼':150}, ignore_index=True)
使⽤ concat 拼接两个 DataFrame
In [1]: df1 = pd.DataFrame(
...:{
...:"A":["A0","A1","A2","A3"],
.
..:"B":["B0","B1","B2","B3"],
...:"C":["C0","C1","C2","C3"],
...:"D":["D0","D1","D2","D3"],
...:},
...: index=[0,1,2,3],
...:)
...:
In [2]: df2 = pd.DataFrame(
...:{
...:"A":["A4","A5","A6","A7"],
...:"B":["B4","B5","B6","B7"],
.
..:"C":["C4","C5","C6","C7"],
...:"D":["D4","D5","D6","D7"],
...:},
...: index=[4,5,6,7],
...:)
...:
In [4]: frames =[df1, df2]
In [5]: result = pd.concat(frames, ignore_index=True)
3.3 更新操作
# at 、iat只能更换单个值
df1.at[0,'⾝⾼'] = 175 # iat ⽤来取某个单值,参数只能⽤数字索引
df1.iat[0,3] = 25 # at ⽤来取某个单值,参数只能⽤index和columns索引名称
4. 样式操作
官⽹推荐使⽤的: xlsxwriter 驱动
4.1 如:修改列宽
df = pd.DataFrame(data=valuesDict,index=[0])
writer = pd.ExcelWriter('./data.xlsx', engine='xlsxwriter')
<_excel(writer, sheet_name='Sheet1')
worksheet = writer.sheets['Sheet1']
worksheet.set_column("A:E",25)# 在这⾥更改宽度值
writer.save()
5. 后续更新
将数据写⼊ Excel (新建xlsx)
# 没有表格的情况下
def to_excel():
# 新建⼀个df对象,并设置header
df = pd.DataFrame(columns=["ID","名称","链接","分类","问题点"])
# 整理数据
data_origin = Api()
n =0
with open("./",'r')as f:
for i in f:
# df中添加数据
df.loc[n]=[Id, title, url, categories, json.dumps(data['noPass'], ensure_ascii=False)] n +=1
print(n)
# 创建⼀个操作引擎
writer = pd.ExcelWriter('./data/问题点记录.xlsx', engine='xlsxwriter')
# 使⽤df和引擎结合
<_excel(writer, index=False, header=True, sheet_name='Sheet1')
# 设置规则
worksheet = writer.sheets['Sheet1']
# 调整样式
worksheet.set_column("A:E",20)
# 写出保存
writer.save()
/docs/user_guide/io.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论