Python处理Excel数据

用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. 一列插值方法

参考文章 利用python对时间序列中缺失值进行线性插值

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)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值