接上节Jingwei:从零开始使用python/pandas操作Excel (1)zhuanlan.zhihu.com
pandas读取Excel数据表进阶
接下来我们再来看一个例子。其中B2至D2为列标题。图1 Excel数据表示例
注意,此时的数据表不再是Excel文件的第一张表。用默认方式读取Excel文件将获得Sheet1的数据。然而Sheet1没有数据,所以读取的结果就是一个空数据表。图2 空工作表读取结果
为pd.read_excel函数添加额外的参数sheet_name即可指定所读取Excel工作表的名称。
xl = pd.read_excel('指向Excel文件的路径', sheet_name='工作表名称')图3 数据读取结果
此时,我们再来看读取到的DataFrame,出现了很多不明字段。这是因为read_excel的默认读取范围从工作表左上角(A1单元格)到数据表的最末行和最末列。由于第一行没有数据,列标题被默认显示为Unnamed:x。第一列也没有数据,所以显示NaN(Not a Number)。这里要注意的是,DataFrame的行或列索引序号都是从0开始的,即第0行为起始行,第0列为起始列。
读取范围的修正
接下来,我们要做一些调整,使Excel工作表的第二行成为列标题,第二列成为数据表的首列。
xl = xl.iloc[:, 1:] # 选取DataFrame的所有行,并截取第二列至最末列。
df = xl.iloc[1:] # 选取DataFrame的第二行至最末行,保留所有列,并将选取的数据表保存在一个新的变量中。图4 选取范围
我们用到了DataFrame的iloc函数
DataFrame.iloc[a:b, c:d]
a、b、c、d为整数。用于选取DataFrame的第a行到第b行、第c列到第d列。
若a不指定数值,则表示从起始行开始;若b不指定数值,则表示到最末行结束;c和d同理。
iloc函数只是选取了DataFrame中的一部分,并不会改变DataFrame的信息。
DataFrame.iloc[a:b]
a、b为整数。在保留所有列的前提下,用于选取DataFrame的第a行到第b行。
现在我们再来看看xl和df两个变量中所存储的DataFrame。图5a 调整选取范围后的xl变量
图5b 调整选取范围后的df变量
df中的数据内容是我们需要的,但是没有得到正确的列标题以及从0开始的索引。我们需要把xl的第0行变为df的列标题,并重新定义索引。
以下两行代码将重新定义df的列标题和索引。
df.columns = pd.Index(xl.iloc[0]) # xl.iloc[0]获取xl变量中数据表的第0行
df.index = pd.Index(range(df.shape[0])) # 根据df的行数重新生成行索引
这里我们用到了Index函数
range
df.shape
我们来看一看修正后的df变量。图6 数据表修正
仔细看会发现,左上角多了一个“0”。原来在将xl第0行传递给df.columns时,xl第0行的行索引被定义为df.columns的名称了。图7 columns的名称
我们可以将df.columns.name的值变为None,就可以把多了的那个“0”变成空值。
df.columns.name = None
最后我们再来看一下修正后的df变量。我们终于得到所需要的数据表了。图8 最终的数据表
小结
本节中,我们讲述了一些进阶方法,用来处理Excel工作表的读取和索引的修正。之后,我们将探讨用pandas代替Excel进行数据处理的方法。敬请期待。
参考