pandas 基本操作学习笔记

pandas的百度百科:

pandas 是基于NumPy的一种工具,该工具是为解决 数据分析 任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。
pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

pandas可以理解为python + data + analysis,对于使用python做数据处理的人来说,pandas是必须要了解的

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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值