一、 创建excel文件

创建空文件:

import pandas as pd

df = pd.DataFrame()
df.to_excel('D:/pyExcel/tmp.xlsx')

给表格加点儿内容:

import pandas as pd

df = pd.DataFrame({'ID':[1,2,3,4],'name':['liu','oio','sda','fss']})
df.to_excel('D:/pyExcel/tmp.xlsx')

文件内容:

    ID    name
0    1    liu
1    2    oio
2    3    sda
3    4    fss


注意,这里第一列自动添加了0、1、2、3 作为索引
如何让ID当做索引呢?

import pandas as pd

df = pd.DataFrame({'ID':[1,2,3,4],'name':['liu','oio','sda','fss']})
df = df.set_index('ID')
df.to_excel('D:/pyExcel/tmp.xlsx')

文件内容如下

ID    name
1    liu
2    oio
3    sda
4    fss

二、读取excel文件

1、读取与简单查看

以选修课表为例:

import pandas as pd
opCourse = pd.read_excel('D:/pyExcel/jlucourse.xlsx')
print(opCourse.head(3)) #查看前3行
print("======================")
print(opCourse.tail(3)) #查看最后三行

输出结果:

吉林大学中心校区2020-2021学年第1学期普通教育公选课开课计划表 Unnamed: 1   Unnamed: 2  ... Unnamed: 7  Unnamed: 8 Unnamed: 9
0                                  序号       开课单位      公选课课程名称  ...       上课时间   上课地点/选课 
人数        起止周
1                                   1        统战部  中国民主党派与社会发展  ...         25  李四光二阶 /300   
    8-17
2                                   2     哲学社会学院         哲学通论  ...         45    逸夫二阶/270       8-17

[3 rows x 10 columns]
======================
    吉林大学中心校区2020-2021学年第1学期普通教育公选课开课计划表 Unnamed: 1  ... Unnamed: 8 Unnamed: 9
163                                 158   公共外语教育学院  ...  逸夫十五阶/300      8-16双
164                                 NaN        NaN  ...        NaN        NaN
165                                 NaN        NaN  ...        NaN        NaN

[3 rows x 10 columns]

注意:excel第一行的数据被视为key值,不算是行数。前三行其实是2-4行。
并且无论输出哪几行,第一行的索引值都会被输出
问题是:第一行明明是表格的名字啊,key值其实在第二行。如何处理呢?

2、首行“脏数据”的处理。

首先,假如第一行是空行,则不需要任何操作,程序会自动把第二行作为索引

但假如不是空行,可以在读取时设置header参数:

import pandas as pd
opCourse = pd.read_excel('D:/pyExcel/jlucourse.xlsx',header=1)
print(opCourse.head(3))

输出:

  序号    开课单位      公选课课程名称 教师信息      卡号 课程信息(包括学时/学分/类别)        课程编号 上课时
间   上课地点/选课人数   起止周
0  1     统战部  中国民主党派与社会发展  马忠正  216251           30/2/2  gx02250210   25  李四光二阶 /300  8-17
1  2  哲学社会学院         哲学通论   杨晓  607334           30/2/2  tg01110201   45    逸夫二阶/270  8-17     
2  3  哲学社会学院         西方哲学  赵雄峰  600480           30/2/2  tg01110203   45    逸夫七阶/300  8-17

这里注意:excel的行数是从1开始的,python中是从0开始,header=1指的是第2行

这时首行数据相当于被遗弃了,假如将DataFrame对象输出为excel文件,会发现首行数据被删除了。

3、在无key值的列表里添加key值

假如数据是如下这样的呢?

import pandas as pd
opCourse = pd.read_excel('D:/pyExcel/jlucourse.xlsx',header=None)
print(opCourse.columns)
#输出为 Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='int64')
opCourse.columns = ['序号','开课单位','公选课课程名称','教师信息','卡号','课程信息(包括学时/学分/类别)','课程编号','上课时间','上课地点/选课人数','起止周'
]
opCourse.to_excel('D:/pyExcel/jlucourse(1).xlsx')

得到的新表格:

这样,我们添加上了key值,只是表格间距看起来有点儿挤🙄
但是,最左侧又多出来一列index值。
实际上,在用pandas导入excel表格时,假如不指定index,会自动生成新的index。这些index假如再次存入excel,会在新的文件中占据一列。

假如文件中存在index:

import pandas as pd
opCourse = pd.read_excel('D:/pyExcel/jlucourse.xlsx',header=1,index_col='序号')
print(opCourse.head())

假如文件中不存在index名,可以在设置header后再设置index。

import pandas as pd
opCourse = pd.read_excel('D:/pyExcel/jlucourse.xlsx',header=None)
opCourse.columns = ['序号','开课单位','公选课课程名称','教师信息','卡号','课程信息(包括学时/学分/类别)','课程编号','上课时间','上课地点/选课人数','起止周'
]
opCourse.set_index('序号',inplace=True) #与opCourse = opCourse.set_index('序号')的效果相同
opCourse.to_excel('D:/pyExcel/jlucourse(4).xlsx')

三、 行列操作

1、Series

Series可以用于构建dataframe

import pandas as pd
s2 = pd.Series([1,2,3],index=['a','b','c'],name = 'A')
print(s2)

输出结果:

a    1
b    2
c    3
Name: A, dtype: int64
import pandas as pd
s1 = pd.Series([1,2,3],index=['a','b','c'],name = 'A')
s2 = pd.Series([10,20,30],index=['a','b','c'],name = 'B')
s3 = pd.Series([100,200,300],index=['a','b','c'],name = 'C')

df = pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3})
print(df)
   A   B    C
a  1  10  100
b  2  20  200
c  3  30  300

以字典的形式创建,index为列、name为行。

import pandas as pd
s1 = pd.Series([1,2,3],index=['a','b','c'],name = 'A')
s2 = pd.Series([10,20,30],index=['a','b','c'],name = 'B')
s3 = pd.Series([100,200,300],index=['a','b','c'],name = 'C')

df = pd.DataFrame([s1,s2,s3])
print(df)
     a    b    c
A    1    2    3
B   10   20   30
C  100  200  300

以列表的形式创建,name为列、index为行

2、如何读取特定区块的数据?

对于下面这样的表格该怎么处理?

import pandas as pd
df = pd.read_excel('D:/pyExcel/tmp1.xlsx',skiprows=6, usecols='D:F',index_col=None)
# skiprows=6: 跳过前6行
# usecols='D:F' 使用D到F列。 usecols='D,E,F'也是同样的效果
print(df)
    ID  score  data
0    1    NaN   NaN
1    2    NaN   NaN
2    3    NaN   NaN
3    4    NaN   NaN
4    5    NaN   NaN
5    6    NaN   NaN
6    7    NaN   NaN
8    9    NaN   NaN
9   10    NaN   NaN
10  11    NaN   NaN
11  12    NaN   NaN

注意两点:

usecols=’D:F’,包括了F列,这和python切片有区别
skiprows=6和header=6的应用效果是不是相同的呢?…(这个问题以后要注意)
读入时index_col设为None,而没有设成’ID’,这是为了便于之后对’ID’进行操作