资讯专栏INFORMATION COLUMN

Python数据挖掘Pandas详细解答

89542767 / 438人阅读


  大家知道,python有一个比较强大的功能,那就是可以进行数据挖掘,它的数据挖掘能力还是比较的强大的。另外,我们在使用Pandas的时候,也会有各种各样的问题,下面就给大家进行详细解答。


  1DataFrame

  Pandas=panel+data+analysis


  主要是用于大数据挖掘的开源系统Python库


  以Numpy为载体,借助Numpy控制模块这时候计算层面特性强的优越性


  根据matplotlib,可以简单的绘图


  与众不同的算法设计


  方便快捷的数据分析能力


  读取文件便捷


  封装形式了Matplotlib、Numpy的绘图和计算


  核心算法设计


  DataFrame(是series的容器,一般二维)


  Panel(是dataframe的容器,三维)


  Series(一维)


  1.1构造dataframe利用DataFrame函数


  索引:行索引-index,横向索引;列索引-columns,纵向索引


  值:values,利用values即可直接获得去除索引的数据(数组)


  shape:表明形状(形状不含索引的行列)


  T:行列转置


  DataFrame是一个既有行索引又有列索引的二维数据结构


  importnumpyasnp
  importpandasaspd
  a=np.ones((2,3))
  b=pd.DataFrame(a)
  print(a)
  print(b)


  如图,生成的打他frame是一个二维表,由于没有指定索引,因此默认行列索引为数字序号

2.png

  1.2常用操作(设置索引)


  1.获取局部展示


  b.head()#默认展示前5行,可在head()加入数字,展示前几行
  b.tail()#默认展示后5行,可在tail()加入数字,展示后几行


  2.获取索引和值


  importnumpyasnp
  #创建一个符合正态分布的10个股票5天的涨跌幅数据
  stock_change=np.random.normal(0,1,(10,5))
  pd.DataFrame(stock_change)
  #设置行列索引
  stock=["股票{}".format(i)foriinrange(10)]
  date=pd.date_range(start="20200101",periods=5,freq="B")#这个是pandas中设置日期的
  #添加行列索引
  data=pd.DataFrame(stock_change,index=stock,columns=date)
  print(data)

3.png

  3.设置行列索引


  #创建一个符合正态分布的10个股票5天的涨跌幅数据


 stock_change=np.random.normal(0,1,(10,5))
  pd.DataFrame(stock_change)
  #设置行列索引
  stock=["股票{}".format(i)foriinrange(10)]
  date=pd.date_range(start="20200101",periods=5,freq="B")#这个是pandas中设置日期的
  #添加行列索引
  data=pd.DataFrame(stock_change,index=stock,columns=date)
  print(data)

4.png

  4.修改索引


 #不能多带带修改行列总某一个索引的值,可以替换整行或整列例:b.index[2]='股票1'错误
  data.index=新行索引
  #重设索引
  data.reset_index(drop=False)
  #drop参数默认为False,表示将原来的索引替换掉,换新索引为数字递增,原来的索引将变为数据的一部分。True表示,将原来的索引删除,更换为数字递增。如下图

5.png

  

#设置新索引
  df=pd.DataFrame({'month':[1,4,7,10],
  'year':[2012,2014,2013,2014],
  'sale':[55,40,84,31]})
  #以月份设置新的索引
  df.set_index("month",drop=True)


  #见下图,即将原本数据中的一列拿出来作为index

6.png

  new_df=df.set_index(["year","month"])#设置多个索引,以年和月份多个索引其实就是MultiIndex


  可以看到下面的new_df已经是multiIndex类型数据了。


  有三级:indexindex.namesindex.levels


  分别看各自的输出


  1.3MultiIndex与Panel


  MultiIndex:多级或分层索引对象


  Panel:


  pandas.Panel(data=None,items=None,major_axis=None,minor_axis=None,copy=False,dtype=None)


  存储3维数组的Panel结构


  items-axis0,每个项目对应于内部包含的数据帧(DataFrame)。


  major_axis-axis1,它是每个数据帧(DataFrame)的索引(行)。


  minor_axis-axis2,它是每个数据帧(DataFrame)的列。


  items-axis0,每个项目对应于内部包含的数据帧(DataFrame)。


  major_axis-axis1,它是每个数据帧(DataFrame)的索引(行)。


  minor_axis-axis2,它是每个数据帧(DataFrame)的列。


  Pandas从版本0.20.0开始弃用,推荐的用于表示3D数据的方法是DataFrame上的MultiIndex方法


  1.4Series


  带索引的一维数组


  index


  values


 #创建
  pd.Series(np.arange(3,9,2),index=["a","b","c"])
  #或
  pd.Series({'red':100,'blue':200,'green':500,'yellow':1000})
  sr=data.iloc[1,:]
  sr.index#索引
  sr.values#值
  #####就是从dataframe中抽出一行或一列来观察
  12345678910


  2基本数据操作


  2.1索引操作


  data=pd.read_csv("./stock_day/stock_day.csv")#读入文件的前5行表示如下


  ######利用drop删除某些行列,需要利用axis告知函数是行索引还是列索引


  data=data.drop(["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"],axis=1)#去掉一些不要的列


  data["open"]["2018-02-26"]#直接索引,但需要遵循先列后行


  #####按名字索引利用.loc函数可以不遵循列行先后关系


  data.loc["2018-02-26"]["open"]#按名字索引


  data.loc["2018-02-26","open"]


  #####利用.iloc函数可以只利用数字进行索引


  data.iloc[1][0]#数字索引


  data.iloc[1,0]


  #组合索引


  #获取行第1天到第4天,['open','close','high','low']这个四个指标的结果


  data.ix[:4,['open','close','high','low']]#现在不推荐用了


  ###但仍可利用loc和iloc


  data.loc[data.index[0:4],['open','close','high','low']]


  data.iloc[0:4,data.columns.get_indexer(['open','close','high','low'])]


  2.2赋值操作


  data仍然是上图类型


  data.open=100


  data['open']=100


  ###两种方式均可


  data.iloc[1,0]=100


  ###找好索引即可


  2.3排序


 sort_values(比较values进行排序)sort_index(比较行索引进行排序,不行可以先转置简介对列排序)
  data.sort_values(by="high",ascending=False)#DataFrame内容排序,ascending表示升序还是降序,默认True升序
  data.sort_values(by=["high","p_change"],ascending=False).head()#多个列内容排序。给出的优先级进行排序
  data.sort_index(ascending=True)###对行索引进行排序
  #这里是取出了一列“price_change”列,为serise,用法同上
  sr=data["price_change"]
  sr.sort_values(ascending=False)
  sr.sort_index()

  2.4数学运算


  布尔值索引


  算术运算:直接利用运算符或者函数


  #正常的加减乘除等的运算即可


 data["open"]+3
  data["open"].add(3)#open统一加3
  data.sub(100)#所有统一减100data-100
  (data["close"]-(data["open"])).head()#close减open
  逻辑运算:<;>;|;&利用逻辑符号或者函数query
  #例如筛选p_change>2的日期数据
  data[data["p_change"]>2].head()
  #完成一个多个逻辑判断,筛选p_change>2并且low>15
  data[(data["p_change"]>2)&(data["low"]>15)].head()
  data.query("p_change>2&low>15").head()###等效于上一行代码
  ###判断#判断'turnover'列索引中是否有4.19,2.39,将返回一列布尔值
  data["turnover"].isin([4.19,2.39])##如下图
  利用布尔值索引,即利用一个布尔数组索引出True的数据
  ###判断#判断'turnover'列索引中是否有4.19,2.39,将返回一列布尔值
  data["turnover"].isin([4.19,2.39])##如下图
  data[data["turnover"].isin([4.19,2.39])]
  #这块就将返回turnover列布尔值为true的如下图,也就是筛选出turnover中值为4.19和2.39


  ###布尔值索引是一个很方便的数据筛选操作,比如:


  data[data["turnover"]>0.1]


  #也将筛选出turnover列中大于0.1的整体data数据,并不是说只返回turnover相关数据,判断只是返回布尔索引,利用索引的是data数据


  2.5统计运算


  data.describe()


  #将返回关于列的最值,均值,方差等多种信息


  ##其实这里很多就和numpy相似了


  data.max(axis=0)#返回最值


  data.idxmax(axis=0)#返回最值索引


  累计统计函数(累加,累乘等)


  cumsum计算前1/2/3/…/n个数的和


  cummax计算前1/2/3/…/n个数的最大值


  cummin计算前1/2/3/…/n个数的最小值


  cumprod计算前1/2/3/…/n个数的积


  自定义运算


 apply(func,axis=0)
  func:自定义函数
  axis=0:默认按列运算,axis=1按行运算
  data.apply(lambdax:x.max()-x.min())
  #这里的lambdax:x.max()-x.min()是lambda表达式,是函数的简单写法也可
  deffx(data):
  returndata.max()-data.min()


  3画图


  3.1pandas.DataFrame.plot


 x:labelorposition,defaultNone
  y:label,positionorlistoflabel,positions,defaultNone
  Allowsplottingofonecolumnversusanother
  kind:str
  ‘line’:lineplot(default)
  ''bar":verticalbarplot
  “barh”:horizontalbarplot
  “hist”:histogram
  “pie”:pieplot
  “scatter”:scatterplot
  #更简易用matplotlib
  data.plot(x="volume",y="turnover",kind="scatter")
  data.plot(x="high",y="low",kind="scatter")
  data['volume'].plot()

  4文件读取写入


  4.1CSV文件


  DataFrame.to_csv(path_or_buf=None,sep=','columns=None,header=True,index=True,index_label=None,mode='w',encoding=None)


  1


  path_or_buf:stringorfilehandle,defaultNone


  sep:character,default‘,’(分隔符)


  columns:sequence,optional


  mode:'w‘:重写,'a’追加


  index:是否写入行索引


  header:booleanorlistofstring,defaultTrue,是否写进列索引值
  Series.to_csv(path=None,index=True,sep=',',na_rep='',float_format=None,header=False,index_label=None,mode='w',encoding=None,compression=None,date_format=None,decimal='.)
  WriteSeriestoacomma-separatedvalues(csv)file
  pd.read_csv("./stock_day/stock_day.csv",usecols=["high","low","open","close"]).head()#读哪些列
  data=pd.read_csv("stock_day2.csv",names=["open","high","close","low","volume","price_change","p_change","ma5","ma10","ma20","v_ma5","v_ma10","v_ma20","turnover"])#如果列没有列名,用names传入
  data[:10].to_csv("test.csv",columns=["open"])#保存open列数据
  data[:10].to_csv("test.csv",columns=["open"],index=False,mode="a",header=False)#保存opend列数据,index=False不要行索引,mode="a"追加模式|mode="w"重写,header=False不要列索引


  4.2HDF5文件


  read_hdfto_hdf


  HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame,也就是说hdf5存储的是panel这种三维类型,一个key对应一个dataframe


  pandas.read_hdf(path_or_buf,key=None,**kwargs)


  从h5文件当中读取数据


  path_or_buffer:文件路径


  key:读取的键


  mode:打开文件的模式


  reurn:TheSelectedobject


  DataFrame.to_hdf(path_or_buf,key,**kwargs)


  day_close=pd.read_hdf("./stock_data/day/day_close.h5",key="close")


  day_close.to_hdf("test.h5",key="close")


  4.3JSON文件


  read_jsonto_json


  pandas.read_json(path_or_buf=None,orient=None,typ=“frame”,lines=False)


  将JSON格式转换成默认的PandasDataFrame格式


  orient:string,IndicationofexpectedJSONstringformat.


  ‘split’:dictlike{index->[index],columns->[columns],data->[values]}


  ‘records’:listlike[{column->value},…,{column->value}]


  ‘index’:dictlike{index->{column->value}}


  ‘columns’:dictlike{column->{index->value}},默认该格式


  ‘values’:justthevaluesarray


  lines:boolean,defaultFalse


  按照每行读取json对象


  typ:default‘frame’,指定转换成的对象类型series或者dataframe


  sa=pd.read_json("Sarcasm_Headlines_Dataset.json",orient="records",lines=True)


  ##主要是path,orient是一种确定索引与数值的对应,以本例来看,列索引就是‘key',values就是key对应的值


  sa.to_json("test.json",orient="records",lines=True)


  5高级处理


  5.1缺失值(标记值)处理


  主要参数


  inplace实现数据替换(默认为False)


  dropna实现缺失值的删除(默认删除行)


  fillna实现缺失值的填充


  isnull或notnull判断是否有缺失数据NaN


  如何进行缺失值处理?


  删除含有缺失值的样本


  替换/插补数据


  判断NaN是否存在


  pd.isnull(df)会返回整个dataframe的布尔框架,难以观察(bool为True代表那个位置是缺失值)


  pd.isnull(df).any()表示只要有一个True就返回True


  pd.notnull(df)会返回整个dataframe的布尔框架,难以观察(bool为False代表那个位置是缺失值)


  pd.notnull(df).all()表示只要有一个False就返回False


  删除nan数据


  df.dropna(inplace=True)默认按行删除inplace:True修改原数据,False返回新数据,默认False


  替换nan数据


  df.fillna(value,inplace=True)


  value替换的值


  inplace:True修改原数据,False返回新数据,默认False


  movie["Revenue(Millions)"].fillna(movie["Revenue(Millions)"].mean(),inplace=True)


  ###这就是先利用其他代码判断出"Revenue(Millions)"有nan数据,然后利用.fillna函数,令value=movie["Revenue(Millions)"].mean()列的均值,然后inplace=True修改原数据


  importpandasaspd


  importnumpyasnp


  movie=pd.read_csv("./IMDB/IMDB-Movie-Data.csv")


  #1)判断是否存在NaN类型的缺失值


np.any(pd.isnull(movie))#返回True,说明数据中存在缺失值
  np.all(pd.notnull(movie))#返回False,说明数据中存在缺失值
  pd.isnull(movie).any()
  pd.notnull(movie).all()
  #2)缺失值处理
  #方法1:删除含有缺失值的样本
  data1=movie.dropna()
  pd.notnull(data1).all()
  #方法2:替换
  #含有缺失值的字段
  #Revenue(Millions)
  #Metascore
  movie["Revenue(Millions)"].fillna(movie["Revenue(Millions)"].mean(),inplace=True)
  movie["Metascore"].fillna(movie["Metascore"].mean(),inplace=True)
  替换非nan的标记数据
  有些数据不存在可能标记为“#”,“?”等
  #读取数据
  path="wisconsin.data"
  name=["Samplecodenumber","NormalNucleoli","Mitoses","Class"]
  data=pd.read_csv(path,names=name)


  #这里的非nan标记值缺失值就是利用“?”表示的,因此利用参数to_replace,value=np.nan,将默认标记值替换为nan值,然后再利用签署方法处理nan缺失值


  #1)替换


  data_new=data.replace(to_replace="?",value=np.nan)


  5.2离散化


  这一块建议去看视频,理解更快:视频地址


  连续属性的离散化就是将连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数值代表落在每个子区间的属性值。


  连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。


  实现方法:


  1.分组


  自动分组sr=pd.qcut(data,bins)


  自定义分组sr=pd.cut(data,[])


  2.将分组好的结果转换成one-hot编码(哑变量)


  pd.get_dummies(sr,prefix=)


  one-hot编码:


  one-hot


  比如男女数据一般用1和0表示,但1和0本身有大小问题,而男女只是不同的概念,因此用1,0表示会存在区别


  同时还可处理连续数据,比如将身高的连续数据分为不同的身高区间,每个区间对应一个类别,然后类比同上来考虑


  #1)准备数据


  data=pd.Series([165,174,160,180,159,163,192,184],index=['No1:165','No2:174','No3:160','No4:180','No5:159','No6:163','No7:192','No8:184'])


  #2)分组


  #自动分组


  sr=pd.qcut(data,3)


  sr.value_counts()#看每一组有几个数据


  #3)转换成one-hot编码


  pd.get_dummies(sr,prefix="height")


  #自定义分组


  bins=[150,165,180,195]#这就表示有三组[150,165][165,180][180,195]


  sr=pd.cut(data,bins)


  #get_dummies


  pd.get_dummies(sr,prefix="身高")


  5.3合并


  指合并不同dataframe上的内容数据


  按方向


  pd.concat([data1,data2],axis=1)


  #axis:0为列索引;1为行索引


  按索引


 left=pd.DataFrame({'key1':['K0','K0','K1','K2'],
  'key2':['K0','K1','K0','K1'],
  'A':['A0','A1','A2','A3'],
  'B':['B0','B1','B2','B3']})
  right=pd.DataFrame({'key1':['K0','K1','K1','K2'],
  'key2':['K0','K0','K0','K0'],
  'C':['C0','C1','C2','C3'],
  'D':['D0','D1','D2','D3']})
  pd.merge(left,right,how="inner",on=["key1","key2"])
  pd.merge(left,right,how="left",on=["key1","key2"])
  pd.merge(left,right,how="outer",on=["key1","key2"])
  ###这里merge参数解释:
  #left:需要合并的一个表,合并后在左侧
  #right:需要合并的一个表,合并后在右侧
  #how:合并方式


  #on:在哪些索引上进行合并


  5.4交叉表与透视表


  交叉表


  交叉表用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)


  pd.crosstab(value1,value2)


  data=pd.crosstab(stock["week"],stock["pona"])


  data.div(data.sum(axis=1),axis=0).plot(kind="bar",stacked=True)


  透视表


  相对于交叉表操作简单些


  #透视表操作


  stock.pivot_table(["pona"],index=["week"])


  5.5分组与聚合


  分组与聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组情况。


 DataFrame.groupby(key,as_index=False)key:分组的列数据,可以多个
  col=pd.DataFrame({'color':['white','red','green','red','green'],'object':['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})

  #进行分组,对颜色分组,price1进行聚合


  #用dataframe的方法进行分组


  col.groupby(by="color")


  #或者用Series的方法进行分组聚合


  col["price1"].groupby(col["color"])


  6案例


  要求


  想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?


  对于这一组电影数据,如果我们想看Rating,Runtime(Minutes)的分布情况,应该如何呈现数据?


  对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何


  处理数据?


  数据结构展示


  代码


  #1、准备数据


  

movie=pd.read_csv("./IMDB/IMDB-Movie-Data.csv")


  ###movie读入后如上图所示


  ######################问题一


  #问题1:我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?


  #评分的平均分


  movie["Rating"].mean()


  #导演的人数


  np.unique(movie["Director"]).size


  ######################问题二


  ##绘制直方图查看分布


  movie["Rating"].plot(kind="hist",figsize=(20,8))


  #利用matplotlib可更细致绘图


  importmatplotlib.pyplotasplt


  #1、创建画布


  plt.figure(figsize=(20,8),dpi=80)


  #2、绘制直方图


  plt.hist(movie["Rating"],20)


  #修改刻度


  plt.xticks(np.linspace(movie["Rating"].min(),movie["Rating"].max(),21))


  #添加网格


  plt.grid(linestyle="--",alpha=0.5)


  #3、显示图像


  plt.show()


  ######################问题三


  ##如果我们希望统计电影分类(genre)的情况,应该如何处理数据?


  ###可以发现图中genre一列数据中每个电影都有多种标签,因此要先分割


  #先统计电影类别都有哪些


  movie_genre=[i.split(",")foriinmovie["Genre"]]


  ###得到的movie_genre结构图见《下图一》


  ###这一块主要是把movie_genre的二维列表变为以为列表,然后利用unique函数去重


  movie_class=np.unique([jforiinmovie_genreforjini])


  len(movie_class)####这就得到了电影的类型标签种类数


  #统计每个类别有几个电影


  count=pd.DataFrame(np.zeros(shape=[1000,20],dtype="int32"),columns=movie_class)


  count.head()###得到的count结构如《下图二》


  #计数填表


  foriinrange(1000):


  count.ix[i,movie_genre[i]]=1###注意ix现在不太能用了


  ############movie_genre[i]将返回字符索引列


  #这就得到了下面第三张图片的数据处理效果,列表示电影类型种类,行表示不同电影,如《下图三》


  #因此只需逐列求和即可得到每类标签电影的数量


  ##最终实现数据可视化如《下图四》


 count.sum(axis=0).sort_values(ascending=False).plot(kind="bar",figsize=(20,9),fontsize=40,colormap="cool")


  综上所述,小编就为大家介绍到这里了,希望可以给大家带来帮助

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/127840.html

相关文章

  • Python如何利用pandas读取csv数据并绘图

      小编写这篇文章的一个主要目的,主要是给大家去做一个解答,解答的内容主要是Python相关知识,比如说,会给大家讲解怎么样去利用Python pandas去做一个读取,读取的是csv数据,然后将这些数据去做一个绘图处理,具体内容下面给大家详细解答。  如何利用pandas读取csv数据并绘图  导包,常用的numpy和pandas,绘图模块matplotlib,  importmatplotli...

    89542767 评论0 收藏0
  • Python如何批量将csv文件编码方式转换为UTF-8?下面就给大家解答

      csv文件其实就是单纯的储存文本数据的一种形式,那么,在日常的办公当中,要怎么做去提高其办公的效率呢?比如,如何使用Python去批量的进行处理文件,批量的处理csv文件,怎么将编码转换成为YTF-8的形式呢?下面给大家详细的解答下。  当我们用pandas是操作CSV文件的时候,常常会因为编码问题出现报错。  pandas_libsparsers.pyx in pandas._libs.pa...

    89542767 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<