组队学习介绍
最近事情太多(以及人太懒),好久没有空更新博客,遂报名公众号Datawhale的Pandas学习小组来督促自己学习。学习小组的目的主要是细致地学习Python中的第三方模块Pandas,该模块用于数据导入及整理的模块,对数据挖掘前期数据的处理工作十分有用。
学习小组的时间安排大致如下:
-
Task01:Pandas基础(1天)
-
Task02:索引(3天)
-
Task03:分组(2天)
-
Task04:变形(2天)
-
Task05:合并(2天)
-
Task06:综合练习(1天)
学习小组的参考资料是Datawhale-GYH助教撰写的1。
本博文的笔记概览如下所示:
Pandas基础
一、文件读取与写入
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
函数或del
或pop
。用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
clip
和replace
是两类替换函数。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()
参考资料
@GYHHAHA的githubhttps://github.com/datawhalechina/joyful-pandas ↩︎