用Python读入Excel数据一般有两种方式,一种是通过 xlrd 方式,一种是通过 pandas 方式。
推荐使用 pandas 方式。
pandas方式
参考文章
常规用法
import pandas as pd
#方法一:默认读取第一个表单
df=pd.read_excel('lemon.xlsx')#这个会直接默认读取到这个Excel的第一个表单
data=df.head()#默认读取前5行的数据
#方法二:通过指定表单名的方式来读取
df=pd.read_excel('lemon.xlsx',sheet_name='student')#可以通过sheet_name来指定读取的表单
data=df.head()#默认读取前5行的数据
#方法三:通过表单索引来指定要访问的表单,0表示第一个表单
#也可以采用表单名和索引的双重方式来定位表单
#也可以同时定位多个表单,方式都罗列如下所示
df=pd.read_excel('lemon.xlsx',sheet_name=['python','student'])#可以通过表单名同时指定多个
# df=pd.read_excel('lemon.xlsx',sheet_name=0)#可以通过表单索引来指定读取的表单
# df=pd.read_excel('lemon.xlsx',sheet_name=['python',1])#可以混合的方式来指定
# df=pd.read_excel('lemon.xlsx',sheet_name=[1,2])#可以通过索引 同时指定多个
data=df.values#获取所有的数据,注意这里不能用head()方法哦~
print("获取到所有的值:\n{0}".format(data))#格式化输出
接下来就是按照 pandas 的方式来处理数据就可以了。比如只获取数据则使用 values,如
alpha = pd.read_excel('aerodynamic.xls',sheet_name='Alpha',header=None).values
从第一行读取正文数据
参考文章 pandas指定从第一行读取正文数据
有的时候excel文件是没有列标签的,而pandas默认读取excel文件的时候是将第一行作为列标签来读取的,所以文件中的第一行数据就被读成了列标签了,解决方法是在读取或者写入excel文件的时候设置header = None或者是index = None
import pandas as pd
import numpy as np
if __name__ == '__main__':
# 读取文件的时候header设置为None
data = pd.read_excel("pandas条件表达式.xlsx", header=None)
print(data)
data = data[data[2] > 21]
print(data)
# 写入文件的时候header,index设置为None
data.to_excel("pandas条件表达式-筛选.xlsx", index=None, header=None)
补全缺失值
有时一个表格中会有一些值是NaN,如果有必要可以采用一些方法补全。
1. sklearn方法
一开始看到这篇文章 Python如何优雅地处理NaN,其中采用了 from sklearn.preprocessing import Imputer 的方式,但发现会报错
ImportError: cannot import name ‘Imputer’ from ‘sklearn.preprocessing’
原因是目前的sklearn的 Imputer 不在 preprocessing 中了,正确的使用方法应该是
from sklearn.impute import SimpleImputer
my_imputer = SimpleImputer()
data_imputed = my_imputer.fit_transform(df)
print (type(data_imputed))
# array转换成df
df_data_imputed = pd.DataFrame(data_imputed,columns=df.columns)
print (df_data_imputed)
但是SimpleImputer的方法填充数据方法似乎很有限,strategy 只有 ‘mean’ ‘median’ 等少数几个,感觉不太好用。
2. 一列插值方法
3. 一次性全部插值
这是自己最终采用的方法
参考文章 Pandas模块-插值法填补缺失值
采用的方式非常简单,一行代码即可
df = df.interpolate(method='cubic')
可选择的method可以在interpolate定义中找到,方法还是比较丰富的,常用如下:
nearest:最邻近插值法
zero:阶梯插值
slinear、linear:线性插值
quadratic、cubic:2、3阶B样条曲线插值
* 'linear': Ignore the index and treat the values as equally
spaced. This is the only method supported on MultiIndexes.
* 'time': Works on daily and higher resolution data to interpolate
given length of interval.
* 'index', 'values': use the actual numerical values of the index.
* 'pad': Fill in NaNs using existing values.
* 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'spline',
'barycentric', 'polynomial': Passed to
`scipy.interpolate.interp1d`. These methods use the numerical
values of the index. Both 'polynomial' and 'spline' require that
you also specify an `order` (int), e.g.
``df.interpolate(method='polynomial', order=5)``.
* 'krogh', 'piecewise_polynomial', 'spline', 'pchip', 'akima',
'cubicspline': Wrappers around the SciPy interpolation methods of
similar names. See `Notes`.
* 'from_derivatives': Refers to
`scipy.interpolate.BPoly.from_derivatives` which
replaces 'piecewise_polynomial' interpolation method in
scipy 0.18.
4. 其他方法
参见文章 如何用Pandas处理缺失值
将DataFrame转换为Array
参考文章 详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
import numpy as np
import pandas as pd
df=pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]})
df.values #方法一
df.as_matrix() #方法二
np.array(df) #方法三
完整示例
import pandas as pd
import numpy as np
'''
提取表格数据
'''
alpha = pd.read_excel('aerodynamic.xls',sheet_name='Alpha',header=None).values
index0 = np.where(alpha==0)[0][0]
alpha = alpha[index0:] #只选取部分数据
df = pd.read_excel('aerodynamic.xls',sheet_name='Cl',header=None)
df = Cl_df.interpolate(method='cubic') #插值补全空缺值
Cl = Cl.values[index0:,:] #选择部分数据
xlrd方式
这种方式似乎只能读取 .xls 格式的Excel,而不能读取 .xlsx 格式。(网上的例子都是用的 .xlsx 格式,但自己这里会报错)
读取之后的数据处理也有诸多不便,好像只能一行一行读取或者一个一个单元格读取,还容易出现格式问题,因此网上很多人都会再单独写一个读取 Excel 的类或者函数。如果直接读取一个 sheet 的数得到的数据格式是 sheet 的,没法直接使用。
另外也不能用插值等方式处理缺失值等问题。
【参考文章】
常用操作有
# 打开文件
workbook = xlrd.open_workbook('aerodynamic.xls')
# 获取所有sheet名字
print(workbook.sheet_names()) # [u'sheet1', u'sheet2']
#获取sheet2名字
sheet2_name= workbook.sheet_names()[1]
# 根据sheet索引或者名称获取sheet内容
sheet2 = workbook.sheet_by_name('Sheet2')
sheet2 = workbook.sheets()[2]
# sheet的名称,行数,列数
print(sheet2.name,sheet2.nrows,sheet2.ncols)
rows = sheet2.row_values(3) # 获取第四行内容
cols = sheet2.col_values(2) # 获取第三列内容
#获取单元格内容的三种方法
print(sheet2.cell(1,0).value)
print(sheet2.cell_value(1,0))
print(sheet2.row(1)[0].value)
# 获取一行内容
a = sheet2.row_values(0)
b = sheet2.row_values(1)
aeropara = np.array([a,b])
# 获取单元格内容的数据类型
print(sheet2.cell(1,3).ctype)
print(type(sheet2.cell_value(1,3)))