pandas的百度百科:
pandas 是基于NumPy的一种工具,该工具是为解决 数据分析 任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。
pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
pandas可以理解为python
+ data
+ analysis
,对于使用python做数据处理的人来说,pandas是必须要了解的
DataFrame 简介:
DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。DataFrame 是最常用的 Pandas 对象,与 Series 一样,DataFrame 支持多种类型的输入数据。
常用的DataFrame读写方法:
- 读: read_csv, read_excel
- 写: to_csv, to_excel
补充:
csv文件是纯文本(通常用,
进行分隔),不含像二进制数字那样必须被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔。
读取csv和txt文件:
csv和txt文件都是文本文件,使用pd.read_csv()
方法读取数据:
pd.read_csv(filepath_or_buffer,sep=’,’,names=None,index_col=None,usecols=None,nrows=None,parse_dates=False,date_parser=None,encoding=None)
常要用到的参数:
filepath_or_buffer
: 文件路径,可以用相对路径。格式为文件路径
+文件名
+后缀
sep
:列之间分隔符,默认是,
encoding
: 编码格式,默认是utf-8
parse_dates
:需要转化为时间的列,默认为False;pandas中的时间数据是时间戳,有时从文件中读取的时间数据会是数字,此时需要做处理。
读取XLSX文件:
XLSX是excel的文件格式。
pd.read_excel(io,sheet_name=0,header=0,index_col=None,parse_cols=None,usecols=None,nrows=None,parse_dates=False,date_parser=None,encoding=None)
常用到的参数:
io
: 文件路径,同上parse_dates
:同上
练习:
使用一个记录了某学校学生某次考试的execl文件:students.xlsx作为练习对象:点这里下载,提取码:sjd5
IDE: spyder(anaconda)
导入用到的包:
import pandas as pd
import os
读入数据,stu_data是DataFrame类型:
stu_data = pd.read_excel(r'resource/students.xlsx',\
dtype = {'name':str, 'class':str, 'english':int, 'math':int, 'Physis':int, 'chemistry':int})
注意:读取文件到数据集stu_data之后,对stu_data的处理都是在内存中的处理,并不影响实际的文件中的数据
修改列名:
stu_data = stu_data.rename(columns = {'Physis': 'physis'})
# 防止因为class和python关键字冲突而报错
stu_data = stu_data.rename(columns = {'class': 'Class'})
对数据进行检查:
stu_data.shape # (100, 6) 查看行数和列数
stu_data.head() # 检查前n项,默认是5
stu_data.info() # 查看索引、数据类型和内存信息
stu_data.describe() # 查看数值型列的汇总统计
stu_data.dtypes # 查看各字段类型
stu_data.axes # 显示数据行和列名
stu_data.columns # 列名
读入到数据集的时候会自动创建一列index作为索引:
自行指定,建立索引:
stu_data.set_index('name', inplace = True)
会以name作为索引
查看指定列
stu_data['math']
stu_data.math # 同上,如果列名符合python变量名要求,可使用
选择多列
stu_data[['Class', 'math']] # 只看这两列,注意括号
stu_data.loc[:, ['Class', 'math']] # 相同效果
选择行:
用人工索引选取:
stu_data[stu_data.index == 'Liver'] # 指定索引
用自然索引选择,类似列表的切片:
stu_data[0:3] # 取前三行
stu_data[0:10:2] # 前10个,每两个取一个
stu_data.iloc[:10,:] # 前10个
指定行列:
stu_data.loc['Ben', 'english':'chemistry'] # 只看Ben的四门成绩
stu_data.loc['Eorge':'Alexander', 'Class':'chemistry'] # 指定行区间
条件选择
单一条件:
stu_data[stu_data.math > 90] # 数学90分以上的
stu_data[stu_data.Class == '2'] # 2班的
stu_data[stu_data.index == 'Oscar'] # 指定索引即原数据中的 name
组合条件:
stu_data[(stu_data['math'] > 90) & (stu_data['Class'] == '3')] # and 关系
stu_data[stu_data['Class'] == '3'].loc[stu_data.math > 90] # 多重筛选
排序:
stu_data.sort_values(by='math') # 按数学成绩升序排列
stu_data.sort_values(by='physis', ascending=False) # 降序
stu_data.sort_values(['Class', 'math'], ascending=[True, False]) # 班级升序,math降序
分组聚合:
stu_data.groupby('Class').sum() # 按团队分组对应列相加
stu_data.groupby('Class').mean() # 按团队分组对应列求平均
不同列不同的计算方法:
stu_data.groupby('Class').agg({'english': sum, # 总和
'math': 'count', # 总数
'physis': 'mean', # 平均
'chemistry': max}) # 最大值
矩阵转置
stu_data.groupby('Class').sum()
stu_data.groupby('Class').sum().T
stack() 堆叠,将列旋转到行:
stu_data.groupby('Class').sum().stack()
unstack() 将行旋转到列:
stu_data.groupby('Class').sum().unstack()
增加列 像对字典操作:
stu_data['one'] = 1 # 增加一个固定值的列
stu_data['total'] = stu_data.english + stu_data.math + stu_data.physis + stu_data.chemistry # 增加总成绩列
指定一些列相加增加一个新列:
stu_data['total'] = stu_data.loc[:,'english':'chemistry'].apply(lambda x:sum(x), axis=1)
stu_data['avg'] = stu_data.total/4 # 增加平均成绩列
删除列:
stu_data = stu_data.drop(columns = ['one'])
简单分析
stu_data.mean() # 返回所有列的均值
stu_data.mean(1) # 返回所有行的均值,下同
stu_data.count() # 返回每一列中的非空值的个数
stu_data.max() # 返回每一列的最大值
stu_data.min() # 返回每一列的最小值
stu_data.median() # 返回每一列的中位数
生成图
stu_data['math'].plot() # 数学成绩的折线分布
stu_data.loc['Ben', 'english': 'chemistry'].plot.bar() # 柱状图
stu_data.loc['Ben', 'english': 'chemistry'].plot.barh() # 横向柱状图
stu_data.groupby('Class').count().math.plot.pie() # 各组人数对比
导出
# 创建文件夹
def create_folder(folder_path):
if not os.path.exists(folder_path): #判断是否有文件夹,没有则创建
os.makedirs(folder_path)
return folder_path
folder_path = create_folder('output/students_test/')
stu_data.to_excel(folder_path + 'students-done.xlsx') # 导出 excel
stu_data.to_csv(folder_path + 'students-done.csv') # 导出 csv
这是结果,实现了简单的操作:
补充:
DataFrame 列名批量大小写转换:
- 转化为小写:df.columns=df.columns.map(lambda x:x.lower())
- 转化为大写:df.columns=df.columns.map(lambda x:x.upper())