数据分析利器 pandas 系列教程(二):强大的 DataFrame

月小水长

且行且编码

在上一篇文章 数据分析利器 pandas 系列教程(一):从 Series 说起  中:详细介绍了 pandas 基础数据结构 Series,今天说说另一种数据结构 DataFrame

dataframe 是表格型的数据结构,由一组有序的列组成,可以看成是由 Series 组成的字典,举个例子:

/namesexcoursegrade
0Bobmalemath99
1Alicefemaleenglish92
2Joemalechinese89
3Bobmalechinese88
4Alicefemalechinese95
5Joemaleenglish93
6Bobmaleenglish95
7Alicefemalemath79
8Joemalemath89

创建 dataframe 的常见方式

同 series 一样,dataframe 也有 index,不同的是,series 除了 index,只有一列,而 dataframe 通常有很多列,比如上面的 dataframe 就有四列,而且都有名字:name、sex、course、grade,通过这些名字,可以索引到某一列,这些名字称为列(索引),因此,在 dataframe,我更愿意将 index 称为行索引,以此和列索引区分开。

创建 dataframe 其实有 N 种方法,没必要一一掌握,毕竟常用的不过两三种,我也不打算把所有的创建方式都说一遍,那样有炫技的嫌疑,按照自己的理解,我把这些创建方式统一分为两大类:按列的方式创建按行的方式创建,只讲这两大类下各自最具代表性的创建方式。

以创建上面那个 dataframe 为例,后同。

通过列创建

import pandas as pd
#没有设置行索引 index,取默认值
df = pd.DataFrame({'name':['Bob','Alice','Joe']*3,
               'sex':['male','female','male']*3,
               'course':['math','english','chinese','chinese','chinese','english','english','math','math'],
               'grade':[99,92,89,88,95,93,95,79,89]})
print(df)

通过行创建

data = [['Bob','male','math',99],
['Alice','female','english',92],
['Joe','male','chinese',89],
['Bob','male','chinese',88],
['Alice','female','chinese',95],
['Joe','male','english',93],
['Bob','male','english',95],
['Alice','female','math',79],
['Joe','male','math',89]]
columns = ['name','sex','course','grade']
df = pd.DataFrame(data=data,columns=columns)
print(df)

打印结果同上。

dataframe 的基本属性和整体描述

属性含义
df.shapedf 的行数、列数
df.indexdf 的行索引
df.columnsdf 的列索引(名称)
df.dtypesdf 各列数据类型
df.valusedf 对象值,是一个二维 ndarray 数组
print(df.shape,'\n')
print(df.index,'\n')
print(df.columns,'\n')
print(df.dtypes,'\n')
print(df.values,'\n')

注意各列的数据类型,由于 pandas 可以自己推断数据类型,因此 grade 为 64 位 int 型而不是 object 类型。

函数作用
df.head()打印前面 n 行,默认 5 行
df.tail()打印后面 n 行,默认 5 行
df.info()打印行数、列数、列索引、列非空值个数等整体概览信息
df.describe()打印计数、均值、方差、最小值、四分位数、最大值等整体描述信息
print(df.head(),'\n')
print(df.tail(3),'\n')
print(df.info(),'\n')
print(df.describe(),'\n')

dataframe 查询

loc[] 和 iloc[]

看过 上一篇文章 的读者应该知道,iloc[]iinteger 的意思,意味着 iloc[] 只能通过位置查询,而 loc[] 可以通过行、列索引查询;类似地,这两个函数既可以查询,也可以新增、修改。

为体现差异,我们先把行索引从 0-8 变换为 1-9(均指前闭后闭区间,而 range() 是前闭后开区间):

df.index = range(1,10)
print(df,'\n')

假定我们要完成一个任务:把 Bob 的 math 成绩改成 100。

loc[] 完成如下:

df.loc[1,'grade'] = 100
print(df,'\n')

而用 iloc[],对应的代码如下:

df.iloc[0,3] = 100
print(df,'\n')

iloc[] 是根据位置查询的,和行索引、列索引没有一点儿关系,这也是我为什么事先修改行索引的缘故,方便对比iloc[]loc[]的第一个参数信息。

这两次查询都是 点查询,其实 loc[]iloc[] 也支持 块查询,示例代码如下:

print(df.loc[[1,3,9],['name','grade']],'\n')
print(df.iloc[[0,2,8],[0,3]])

遍历查询

for index,row in df.iterrows():
    print(index,': ',row['name'],row['sex'],row['course'],row['grade'])

与 Series 的关系

通过 series 可以创建 dataframe:

names = pd.Series(['Bob','Alice','Joe']*3)
sexs = pd.Series(['male','female','male']*3)
courses = pd.Series(['math','english','chinese','chinese','chinese','english','english','math','math'])
grades = pd.Series([99,92,89,88,95,93,95,79,89])
df = pd.DataFrame({'name':names,'sex':sexs,'course':courses,'grade':grades})

打印结果就是文章开头那个 dataframe,这种创建方式可以划分到 按列的方式创建,不过没有上面所讲的那种方式常用。

而 dataframe 可以通过 df[列名] 的方式得到 series:

print(df['name'],type(df['name']),'\n')

于是乎,所有对 series 的操作,适用于 df['name']:

print(df['name'].values,type(df['name'].values),'\n')
print(df['name'].unique(),type(df['name'].unique()),'\n')

这里我纠正一下我上篇文章中的错误之处:series.values 或 series.unique() 返回的并不是列表,虽然打印结果像列表(因为对 __str__()函数进行了重载),但实际上却是 ndarray 对象,一种类似列表的数组,可以通过 .tolist() 转为列表。

print(df['name'].values.tolist(),type(df['name'].values.tolist()),'\n')
print(df['name'].unique().tolist(),type(df['name'].unique().tolist()),'\n')

series 上次漏说了一个重要的操作 apply():对列上的数据作处理,它可以使用 lambda 表达式作为参数,也可以使用已定义函数的函数名称(不需要带上())作为参数,比如我们让每个人的每门课成绩加减 10 分:

# lambda 表达式适用于比较简单的处理
df['grade'] = df['grade'].apply(lambda x:x-10)
print(df,'\n')
# 定义函数适用于比较复杂的处理,这里仅作示例
def operate(x):
    return x+10
df['grade'] = df['grade'].apply(operate)
print(df)

注意 apply() 函数是有返回值的,并且是要用 df['grade'] 接收而不是 df,否则整个 dataframe 只会剩下 grade 这一列。

新增删除行或列

新增/删除行或列方法不甚枚举,这里我抛砖引玉只说几种常用的。

删除行/列通过 drop() 函数即可完成:

# drop() 的第一个参数是行索引或者列索引
# axis = 0  删除行
df.drop([0,7,8],axis=0,inplace=True) # 删除所有人的数学成绩
# axis = 0  删除列
df.drop(['sex'],axis=1,inplace=True) # 删除所有人的性别信息
print(df)

和 series 一样,新增一行可用 set_value()at[]loc[],如果行索引存在,则是修改,否则就是新增;下面三行代码,每一行的效果相同,都是修改了 Alice 的 english 成绩 为 100:

# 不一定非得要列表,只要是可迭代对象即可
df.loc[1] = ['Alice', 'english', 100]
df.at[1] = ['Alice', 'english', 100]
# set_value 会在将来被舍弃
df.set_value(1, df.columns, ['Alice', 'english', 100], takeable=False)

新增一列可以通过 df[列名]=可迭代对象 或者 df[:,列名]=可迭代对象 实现,来个任务驱动,比如新增一列成绩等级,60 分以下为不及格,60-89 为良,90-100 为优:

level = []
for grade in df['grade'].values.tolist():
    if grade<60:
        level.append('不及格')
    elif grade>=60 and grade<90:
        level.append('良')
    else:
        level.append('优')
df['level'] = level
print(df)

至此,pandas 中两种基本数据结构说完了,下一篇来谈谈 pandas 中各种读写文件函数的坑。

python爬虫人工智能大数据公众号

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人工智能时代,编程已成为一项基本技能。Python,人工智能时代最佳的编程入门语言。本系列课程分为三部分:手把手教你学Python(基础篇)、手把手教你学Python(进阶篇)、手把手教你学Python(实战篇)。面向零基础用户,从无到有,从易到难,层层递进,带你遨游Python世界;采用案例驱动,即学即练即用,将学习落到实处。人工智能时代,编程已成为一项基本技能。国内一些发达省市,已将编程纳入中小学教材;编程门槛大幅降低,已不再是计算机行业的专利;学编程训练思维,受益终生;掌握编程可有效,提升工作效率。Python,人工智能时代最佳的编程入门语言。设计人性化,语法简单,容易掌握,近年来热度不断攀升;丰富的内置标准库,强大的第三方库,大大缩减编程工作量;网络爬虫、数据处理、科学计算方面的优势,适用于各行各业;强大的技术体系,能够胜任Web开发、系统运维、人工智能等主流领域本系列课程的主要内容安排。   基础篇:语法基础程序结构基本数据结构函数与异常处理常见库操作文件操作 …………   进阶篇:面向对象思想数据库操作Numpy库介绍Pandas库介绍数据可视化机器学习算法…………   实战篇:网络爬虫原理Requests库学习电影网站信息抓取Scrapy爬虫框架研招网数据抓取学位论文数据抓取…………课程教学特点:零基础,从无到有,从易到难,层层递进,带你遨游Python的世界;理论联系实践,案例驱动,即学即练即用,将学习落到实处;提供学习交流平台,在线答疑,自学途中不迷茫;本课程适用人群:计算机相关专业的新生准备转型从事数据处理的职场人员各行各业在职数据处理人员希望从事科学研究的人员程序设计爱好者课程目录安排如下: 第9章 Python面向对象9_1_类和对象9_2_实例变量9_3_类变量9_4_类中的方法9_5_类的继承9_6_对象的拷贝9_7_本章小结9_8_练习讲解19_9_练习讲解2第10章 Python操作数据库10_1_数据库基础10_2_结构化查询语句SQL10_3_Python操作数据库核心API10_4_Python操作数据库案例10_5_本章小结10_6_练习讲解第11章 Numpy入门与实践11_1_数组对象-ndarray11_2_索引和切片(上)11_3_索引和切片(下)11_4_Numpy中的通用函数11_5_数组运算11_6_本章小结11_7_练习讲解第12章 Pandas入门与实践12_1_Series和Index介绍12_2_Series数据访问和常用方法12_3_DataFrame创建与数据访问12_4_DataFrame中的属性和方法12_5_DataFrame的合并12_6_Pandas加载数据和缺失值处理12_7_Pandas中分组操作12_8_Pandas中数据合并操作12_9_Pandas综合案例12_10_本章小结12_11_练习讲解第13章 数据可视化-matplotlib13_1_pyplot绘图基础13_2_绘制线形图13_3_绘制直方图13_4_绘制条形图13_5_绘制饼状图13_6_绘制散点图13_7_生成词云图13_8_本章小结13_9_练习讲解第14章 机器学习库 Scikit-learn14_1_机器学习基础14_2_鸢尾花数据读取和可视化14_3_自己写KNN算法实现14_4_调用sklearn中的KNN算法14_5_波士顿房价预测问题14_6_手写数字识别14_7_本章小结 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值