组队学习1:Pandas基础(基于Python)

组队学习介绍

  最近事情太多(以及人太懒),好久没有空更新博客,遂报名公众号Datawhale的Pandas学习小组来督促自己学习。学习小组的目的主要是细致地学习Python中的第三方模块Pandas,该模块用于数据导入及整理的模块,对数据挖掘前期数据的处理工作十分有用。

  学习小组的时间安排大致如下:

  • Task01:Pandas基础(1天)

  • Task02:索引(3天)

  • Task03:分组(2天)

  • Task04:变形(2天)

  • Task05:合并(2天)

  • Task06:综合练习(1天)

  学习小组的参考资料是Datawhale-GYH助教撰写的1


本博文的笔记概览如下所示:



一、文件读取与写入

1.读取

csv格式

规定路径path:

path = '/Users/.../joyful-pandas-master/data/'
df = pd.read_csv(path+'table.csv') # 读取时仅需路径加文件名
df.head()

txt格式

df_txt = pd.read_table(path+'table.txt') # 可设置sep分隔符参数
df_txt

xls格式

首先需要安装第三方模块xlrd

import xlrd
df_excel = pd.read_excel(path+'table.xlsx')
df_excel.head()

2.写入

csv格式

df.to_csv(path+'new_table.csv')

index=False则意味着保存时除去行索引:

df.to_csv('data/new_table.csv', index=False)

xls格式

需要安装第三方模块openpyxl

import openpyxl
df.to_excel(path+'new_table2.xlsx', sheet_name='Sheet1')

二、基本数据结构

1. Series

创建一个Series

对于一个Series,其中最常用的属性为值(values),索引(index),名字(name),类型(dtype)。

s = pd.Series(np.random.randn(5), index=['a','b','c','d','e'], name='这是一个Series', dtype='float64') # np.random.randn标准正态分布随机数
s

Series函数用法:

pd.Series(
		    data=None, # series的数值
		    index=None, # series的索引
		    dtype=None, # series的数据类别
		    name=None, # series的名字
		    copy=False,
		    fastpath=False
		 )

访问Series属性

Series的常见属性如下:

属性 说明
values 获取数组
name 获取名字
index 获取索引
dtype 获取数据形式
index.name 获取索引的名字
ndim 返回底层数据的维数
size 返回基础数据中的元素数
s.values
s.name
s.index
s.dtype

取出某一个元素

>>> s['a']
-0.7107972900209989

调用方法

常用的调用函数:

函数名称 用途
sum 求和
mean 平均值
median 中位数
mad 平均绝对偏差
min 最小值
max 最大值
abs 绝对值
std 标准差
var 方差
quantile 分位数
cummax 累积最大值
cumsum 累积求和
cumprod 累积乘积

调用函数若参数为axis=1,则是对行进行函数运算; 调用函数若参数为axis=0或是无参数,则是对行进行函数运算。例如:df.mean(axis=1)按行求均值,df.mean()与df.mean(axis=0)的结果一致,都是按列求均值。

>>> s.mean()
0.21775909139937272

利用列表生成器打印Series中的每一个量:

>>> print([i for i in s])
[-0.7107972900209989, 0.34794829157517626, -0.45207229452135267, 0.4962425047420775, 1.4074742452219615]

2. DataFrame

创建一个DataFrame

df = pd.DataFrame({'col1':list('abcde'), 'col2':range(5,10), 'col3':[1.3,2.5,3.6,4.6,5.8]}, index=list('一二三四五'))
df

从DataFrame取出一列为Series

df['col1']

注意一下从DataFrame取出一列的类别为Series:

修改行或列名

df.rename(index={'一':'one'}, columns={'col1':'new_col1'})

调用属性和方法

DataFrame 的常见属性

属性 说明
values 获取数值
columns 获取列的名字
index 获取索引
index.name 获取索引的名字
shape 获取形状
df.index
df.columns
df.values
df.shape
df.mean() # 注意调用函数时有“()”

索引对齐特性

这是Pandas中非常强大的特性,不理解这一特性有时就会造成一些麻烦。

df1 = pd.DataFrame({'A':[1,2,3]},index=[1,2,3])
df2 = pd.DataFrame({'A':[1,2,3]},index=[3,1,2])
df1 - df2
# 由于索引对齐,因此结果不是0

列的删除

对于删除而言,可以使用drop函数或delpop。用drop函数删除index='五'的行以及删除columns='col1'的列:

df.drop(index='五', columns='col1') # 设置inplace=True后会直接在原DataFrame中改动

del删除columns='col1'的列:

df['col1'] = [1,2,3,4,5] # 先加回一列col1
del df['col1']
df

pop直接在原来的DataFrame上操作,且返回被删除的列,与python中的pop函数类似:

df['col1'] = [1,2,3,4,5]
df.pop('col1')
df

列的添加

可以直接增加新的列,也可以使用assign方法。可以直接增加新的列:

df1['B'] = list('abc') # df1表格在索引对齐性处首次定义
df1

assign方法不会对原DataFrame做修改。使用assign方法:

df3 = df1.assign(C=pd.Series(list('def'))) 
df3

⚠️此处需要解释一下那个缺失值:C是一个Series,index为0、1、2,values为d、e、f,因此在添加入df1时,由于df1的index为1、2、3,根据索引一致只能放进去e和f,因此最后一个值是NaN。若想要把d、e、f全部填入表格,就需要指定索引,添加参数index=list('123')。下图总结了几种说法(源自小罗同学):

根据数据类型选择列

选择数值型数据的列:

df.select_dtypes(include=['number'])

选择object型数据的列:

df.select_dtypes(exclude=['number'])

或者

df.select_dtypes(include=['object'])

选择小数型变量:

df.select_dtypes(include=['float'])

将Series转换为DataFrame

利用to_frame函数:

s = df.mean()
s.name = 'to_DataFrame'
s.to_frame() # 将Series转换为DataFrame

使用T符号可以转置:

s.to_frame().T

三、常用基本函数

从下面开始,包括后面所有章节,我们都会用到这份虚拟的数据集:

df = pd.read_csv(path+'table.csv')

1. head和tail

df.head()
df.tail()

2. unique和nunique

nunique显示有多少个唯一值:

df['Physics'].nunique()

unique显示所有的唯一值:

df['Physics'].unique()

3. count和value_counts

count返回非缺失值元素个数:

df['Physics'].count()

value_counts返回每个元素有多少个:

df['Physics'].value_counts()

⚠️value_counts不返回缺失值的个数!

4. describe和info

info函数返回有哪些列、有多少非缺失值、每列的类型:

df.info()

describe函数默认统计数值型数据的各个统计量:

df.describe()

describe函数可以自行选择分位数:

df.describe(percentiles=[.05, .25, .75, .95])

对于非数值型数据也可以用describe函数:

df['Physics'].describe()

对于非数值型数据describe函数展示了该变量的总共个数、取值个数、取值最多的那个值及取值最多那个值的频数。

5. idxmax和nlargest

idxmax/argmax函数返回最大值对应的索引,idxmin/argmin返回最小值对应的索引:

df['Math'].idxmax()

nlargest函数返回前几个大的元素值,nsmallest函数功能类似:

df['Math'].nlargest(3)
df['Math'].nsmallest(3)

6. clip和replace

clipreplace是两类替换函数。clip函数是对超过或者低于某些值的数进行截断:

df['Math'].clip(33,80).head()

replace函数是对某些值进行替换:

df['Address'].replace(['street_1','street_2'],['one','two']).head()
# street_1改为one,street_2改为two

通过字典,可以直接在表中修改:

df.replace({'Address':{'street_1':'one','street_2':'two'}}).head()

7. apply函数

apply函数是一个自由度很高的函数,在第3章我们还要提到。对于Series,它可以迭代每一列的值操作:

df['Math'].apply(lambda x:str(x)+'!').head() # 可以使用lambda表达式,也可以使用函数

对于DataFrame,它可以迭代每一个列操作:

df.apply(lambda x:x.apply(lambda x:str(x)+'!')).head() 
# 这是一个稍显复杂的例子,有利于理解apply的功能

四、排序

1. 索引排序

set_index函数可以设置索引:

df.set_index('Math').head()

sort_index函数可以根据索引排序:

df.set_index('Math').sort_index().head() # 可以设置ascending参数,默认为升序
df.set_index('Math').sort_index(ascending=False).head()

2. 值排序

df.sort_values(by='Class').head()

多个值排序,即先对第一层排,在第一层相同的情况下对第二层排序:

df.sort_values(by=['Address','Height']).head()

参考资料


  1. @GYHHAHA的githubhttps://github.com/datawhalechina/joyful-pandas ↩︎

发布了14 篇原创文章 · 获赞 7 · 访问量 3247

猜你喜欢

转载自blog.csdn.net/sunsimiaofromsh/article/details/105626999