本文主要在操作Excel过程中,pandas的一些使用方法。
- 读Excel
- 操作DataFrame
- 写Excel
1、读Excel
读Excel的时候,可以像这样:
import pandas as pd
df_subject = pd.read_excel(‘file.xls’, sheet_name='科目', dtype={'日期': datetime.datetime})
# filename : Excel的文件,可以是包含绝对路径,也可以只是文件名
需要额外注意下,读xls格式的,调用的是xlwt库,读xlsx,调用的openpyxl库。所以如果读xlsx格式的数据时报找不到openpyxl模块,那就装一下咯。
read_excel(),也是有一堆参数可选,我把我用过的加个注释:
def read_excel(io,
sheet_name=0, # 要读取的sheet页的名字,或index
header=0,
names=None, # 指定每列的类名,list
index_col=None,
parse_cols=None,
usecols=None,
squeeze=False,
dtype=None, # 指定某列的类型,{'col_name_1': str, 'col_name_2': int}
engine=None,
converters=None, # 与dtype 类似,但是没看懂 ==
true_values=None,
false_values=None,
skiprows=None, # 跳过几行,再开始读数据
nrows=None,
na_values=None,
keep_default_na=True,
verbose=False,
parse_dates=False,
date_parser=None,
thousands=None,
comment=None,
skip_footer=0,
skipfooter=0,
convert_float=True,
mangle_dupe_cols=True,
**kwds):
...
读出来的数据,就是pandas的DataFrame格式的数据,就可以方便的为所欲为了~~
2、操作DataFrame
2.1 判断DataFrame中是否有缺失值(NaN):
nan_res_exam = df_exam.isnull().any()
isnull(),返回一个DataFrame,标记原来DataFrame中那个值为NaN。
后边再加上any(),返回一个Series,标记没列是否有NaN,有为True,没有False。
2.2 遍历Series
# Series 的结构类似字典,key是自动添加的索引
for idx in series_1.index:
print(series_1[idx])
2.3 遍历DataFrame
# 逐行遍历
# index,行号;row,每行的数据,Series
for index, row in df_test.iterrows():
print(row.get('key', None))
print(row['key'])
# 逐列遍历
# index,列名;col,每列的数据,Series
for index, col in df_test.iteritems():
print(col.get('key', None))
print(col['key'])
2.4 判断Nan
读取出来的值包含Nan时,便于后续程序,常把它转成 0 或者的什么数,这个时候就需要判断一下这个值是不是Nan,怎么办呢。。(后两种方法都不灵~)
if score != score: # OK
score = 0
if score is Nan: # no work
score = 0
if score == None: # no work
score = 0
2.5 按列排序(单列,多列)
把二维的DataFrame的数据,按照某列,或者某几列排序,是个比较常见的需求吧。比如有下面这个数据:
学生 | 班级 | 总成绩 |
小明 | 1 | 56 |
小红 | 2 | 66 |
小丽 | 1 | 76 |
小刚 | 1 | 50 |
小黑 | 2 | 42 |
如果把这个作为结果交上去,估计领导是不会满意的,产品经理也饶不了你啊~
#################################### 多列排序
# df_score 代表上表数据的DataFrame
# sort_values() 排序函数
# by 指定排序的列名 list
# ascending 是否是升序 list(与by中的是对应的)
# inplace 是否用排序后的数据替换原有数据
df_score.sort_values(by=['班级', '总成绩'], ascending=[True, True], inplace=True)
#################################### 单列排序
# 默认是升序
df_score.sort_values(‘班级’, inplace=True)
3、写Excel
写的时候主要分两步:1,初始化DataFrame对象;2,调用 to_excel() 函数
# data_list: [['小明', '1', '56'], [], []]
# col_list: ['学生', '班级', '总成绩']
pd_score = pd.DataFrame(data_list, columns=col_list)
work = pd.ExcelWriter(data_path)
pd_score.to_excel(work,
sheet_name='成绩',
index=False, # 是否保留DataFrame的行索引,一般去掉
columns=col_list, # 列名,不指定就默认是pd_score中指定的列名,也可以只写入pd_score的某几列
startcol=0, # 在Excel中开始写数据的行,从0开始,
startrow=0 # 同上,这就允许在一个sheet页中写入多个DataFrame
...)
在这两步中,需要注意的是:
a,data_list ,相当于一个二维的list,其中每一个list元素的个数与列名列表的个数一致
b,to_excel() 中的参数还有很多,此处只列了比较常用的