「机器学习集训营第一期」第三周总结概要-Pandas


By.zx

这周主要讲的是Pandas相关操作,由于上一周被爬虫虐的够呛,这一周Pandas还稍微熟悉些,基本上又找回点信心了哈~
本周(2017.7.24-2017.7.30)课程安排:
周一:Pandas基本语法结构和使用方法(褚老师)
周二:Pandas基本语法练习(助教张老师、杜老师)
周三:Pandas高级操作方法(褚老师)
周四:针对链家数据进行分析(助教张老师、杜老师)
周日:Pandas高级操作讲解+实训+链家数据分析讲解(寒小阳老师)

总结:
这周的Pandas用法感觉不难,但有很多不知道的技巧,包括上完课后还是有很多没有掌握熟练,只是有一个印象,寒老师在线下课上又照着一个Pandas的CheatSheet把pandas的用法过了一遍,感觉至少知道遇到问题怎么查方便一些了。
对于这周将的pandas内容,由于配合着所爬取链家数据进行处理,期间遇到很多问题,感谢群里的老师、助教和各位大神,答复很快,由于大家做的都是类似的内容,问题很快就能解决哈~~~

通过目录方式大致数理一下这周课程讲解要点。

本周讲解内容目录

1. Pandas与Series的关系
2. Pandas基本操作
2.1 数据选择
2.2 数据运算
2.3 缺失数据处理
3. broadcast
4. Pandas文件读取
5. Pandas高级操作
6. 特征处理
7. 线下实训讲解内容

1. Pandas与Series的关系
pandas是基于Numpy构建的,具有两个主要的数据结构:
Series和DataFrame:
Series是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
可以通过Series的values和index属性获取其数组表现形式和索引对象
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共同用一个索引)。
构建DataFrame的方法有很多,最常用的方法是直接传入一个由等长列表或Numpy数组组成的字典

2. Pandas基本操作
2.1数据选择
Pandas数据处理过程中主要使用DaraFrame类型数据,其数据组成如上所述都是Series类数据。
按行列定位数据:
通过横轴与纵轴的index与columns定位 df[:3]
df['a':'c']
df[df['a']>0] # a列值大于0的行
使用.loc定位
使用.loc定位时,首先定位index内容,其次定位colomns内容
df.loc['City']
df.loc['City']['year']
df.loc[:]['year']
df.loc["Chongqing":"Hangzhou", ["apts", "income"]]
使用.iloc定位
使用.iloc定位与.loc类似,只不过使用的index为行列位置 df.iloc[1]
df.iloc[1][2]
2.2 数据运算
dataframe运算是基于series类型的运算方式,与python正常运算方式相同。
np.log(apts)
apts ** 2
np.log(apts)
2.3 缺失数据处理
可通过.info()查看DataFrame类型数据信息。根据不同数据内容选择处理缺失值方法。
参考 https://pandas.pydata.org/pand ... .html

3.broadcast
广播就是匹配,扩展维度
对于拥有不同维度,需要对齐的对象进行操作。Pandas会自动的沿着指定的维度进行广播。
最简单的广播方式例如:一个矩阵减去一个常数,那么这个矩阵中的每一个元素减去这个常数。
广播具体方式可参看下图:

1.jpg


4.Pandas文件读取
Pandas内嵌类非常方便的文件读写方法,如:
pd.read_csv("data/GOOG.csv", index_col=0)
读取过程中指定第一列为index列
df.to_csv("data/sample.tsv", sep="\t")
使用\t作为分割符 Pandas具体读写操作可参考以下链接:
read_csv: https://pandas.pydata.org/pand ... .html
to_csv: https://pandas.pydata.org/pand ... .html

5. Pandas高级操作

groupby
groupby是非常重要的一个操作方式,在分析链家数据时候经常用到。
例如:group_by_name = salaries.groupby('Name')
groupby构造了一个GroupBy object,将数据按指令列的内容进行分组,但此时列中的内容并未做处理,因此不能显示出来,但可以对这个object做各种操作,以便进一步显示数据。
例如:group_by_name.sum()
Aggregate
aggregate,使用时也可用agg代替,故名思议是数据的聚合方法,也是非常重要的一个操作方式,在分析链家数据也在很多地方发挥很大作用,熟练使用后可以代码可以简洁很多哈。
例如:group_by_name.aggregate(sum)
concat
concat可以沿着横轴或纵轴将多个对象堆叠到一起,默认情况下是以index为准,即concat是在数据数增加行数据。
merge
使用merge的时候可以选择多个key作为复合可以来对齐合并,通过on指定数据合并对齐的列,通过how指定合并的方式。
例如:pd.merge(result, df4, on='cities', how='outer')
其中:
● left:只保留左表的所有数据
● right:只保留右表的所有数据
● inner: 只保留两个表中公共部分的信息
● outer: 保留两个表的所有信息
join
join方法是一种快速合并的方法,默认以index作为对齐的列。join中的how参数和merge中的how参数一样,用来指定表合并保留数据的规则。
在实际应用中如果右表的索引值正是左表的某一列的值,这时可以通过将 右表的索引 和 左表的列 对齐合并这样灵活的方式进行合并。例如:

2.jpg

课程上使用了以下几个例子进行数据整理:
bike project
stocks project
credit project

6.特征处理
参考寒小阳老师关于特征处理的教程
https://github.com/HanXiaoyang ... ipynb

7.线下实训讲解内容
初始化pandas.Dataframe类型
聚合、坐标变换操作
数据格式变换/变形
慎重使用,会产生大量层次化数据
melt
privot
contat([df1,df2])
concat([df1,df2],axis=1)
● 表合成,合并两个表时候使用concat
● 表拼接,当两个表维度不一样是,使用merge做关联

sort排序
sort排序如需修改原表,需要重新赋值给原表,或 inplace=True
df=df.sort_values("")
df=df.sort_index()
df=df.rename(columns={'y':'year'})
df=df.reset_index() 使被groupby的结果拉平
df=df.drop(['Length','Hieght'].axis=1) 删除某列
axis=1 按列做操作, axis=0 按行做操作

取子集

● 按行取子集
df[df.Length > 7]
用操作符&和| 做组合,不同条件用()括起来
df.drop_duplicates()
df.sample(frac=0.5)对数据进行采样
frac: 按百分比进行采样
df.ilco[10:20]
df.nlargest(n,'value') # 获取最大的n个
df.nsmallest(n,'value') # 获取最小的n个
逻辑判断符: != == df.any() df.all()
● 按列取子集
df[['width','length','species']] df['width']
df.filter(regex='regex') # 使用正则表达式筛选列
df.loc[:,'x2':'x4']
df.iloc[:,[1,2,5]]
第一列从0开始
df.loc[df['a'] > 10, ['a','c']]
,前表示行, ,后表示列

数据总结 Summarize Data
df['Length'].value_counts() 用于了解数据类别分布
len(df) 总数据长度
len(df['w'].unique()) 总共有多少不同类别
unique() 与value_counts()在大部分情况下结果一直,但在有缺省值时,unique()返回缺省值,value_counts()忽略缺省值
df.describe()对数据列进行统计,最大、最小、均值、分位数
df.info() 判断每个数据有多少值,从而可以判断是否有缺省值
sum() count() median() quantile([0.25,0.75]) min() max() mean() std()

对缺省值处理
df=df.dropna() 删除所有NA或null数据类型
df=df.fillna(value) 用value替换所有NA或null数据类型
df=df.assign(Area=lambda df: df.Length*df.Height)
df['Volume']=df.Length
df.qcut(df.col,n,labels=False) 分桶
clip(lower=-10.upper=10) 截断数据

分组 Group Data
df.groupby(by='col')
agg(function)
size() 判断每个组的大小
shift(1) 数据平移往后挪, shift(-1) 数据往前平移
Windows
df.expanding()
df.rolling()
组合 Combine merge() 一般只能做两棵树,但拼接方式比较灵活
pd.merge(adf,bdf,how='left',on='x1') 没有值是取空
pd.merge(adf,bdf,how='inner',on='x1')
数据筛选
adf[adf.x1.isin(bdf)]
adf[~adf.x1.isin(bdf.x1)]

统计信息
协方差:df.cov() # pairwise covariance cols
相关系数:df.corr() # pairwise correlation cols
峰度:df.kurt() # kurtosis over cols (def)
均方误差:df.mad() # mean absolute deviation
标准差:df.sem() # standard error of mean
方差:df.var() # variance over cols (def)
已邀请:

要回复问题请先登录注册

返回顶部