从零开始使用python/pandas操作Excel (2)
接上节
pandas读取Excel数据表进阶
接下来我们再来看一个例子。其中B2至D2为列标题。
注意,此时的数据表不再是Excel文件的第一张表。用默认方式读取Excel文件将获得Sheet1的数据。然而Sheet1没有数据,所以读取的结果就是一个空数据表。
为pd.read_excel函数添加额外的参数sheet_name即可指定所读取Excel工作表的名称。
xl = pd.read_excel('指向Excel文件的路径', sheet_name='工作表名称')
此时,我们再来看读取到的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的第二行至最末行,保留所有列,并将选取的数据表保存在一个新的变量中。
我们用到了DataFrame的iloc函数 [1] 。上面的两行代码涉及了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。
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函数 [2] ,其作用是将一个序列转化为数据表的索引对象。DataFrame的columns和index都属于一种索引对象。通过给columns和index赋值,我们可以任意修改数据表的列标题和行索引。
range [3] 用于生成一个连续数列。range(x),其中x为正整数,生成的序列由0开始,直到x-1结束。
df.shape [4] 存储了数据表各个维度的长度,对于一个二维的数据表,df.shape[0]得到的是第一维的长度,即数据表的行数;df.shape[1]得到的是第二维的长度,即数据表的列数。
我们来看一看修正后的df变量。
仔细看会发现,左上角多了一个“0”。原来在将xl第0行传递给df.columns时,xl第0行的行索引被定义为df.columns的名称了。
我们可以将df.columns.name的值变为None,就可以把多了的那个“0”变成空值。
df.columns.name = None
最后我们再来看一下修正后的df变量。我们终于得到所需要的数据表了。
小结
本节中,我们讲述了一些进阶方法,用来处理Excel工作表的读取和索引的修正。之后,我们将探讨用pandas代替Excel进行数据处理的方法。敬请期待。
参考
- ^ DataFrame.iloc https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html?highlight=iloc#pandas.DataFrame.iloc
- ^ pandas.Index https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Index.html#pandas.Index
- ^ range https://docs.python.org/3.8/library/stdtypes.html#range
- ^ DataFrame.shape https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.shape.html#pandas.DataFrame.shape