Python数据分析之pandas学习

Posted konglingbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据分析之pandas学习相关的知识,希望对你有一定的参考价值。

#python中的pandas库主要有DataFrame和Series类(面向对象的的语言更愿意叫类) DataFrame也就是
#数据框(主要是借鉴R里面的data.frame),Series也就是序列 ,pandas底层是c写的 性能很棒,有大神
#做过测试 处理亿级别的数据没问题,起性能可以跟同等配置的sas媲美
#DataFrame索引 df.loc是标签选取操作,df.iloc是位置切片操作
print(df[[\'row_names\',\'Rape\']])
df[\'行标签\']
df.loc[行标签,列标签]
print(df.loc[0:2,[\'Rape\',\'Murder\']])
df.iloc[行位置,列位置]
df.iloc[1,1]#选取第二行,第二列的值,返回的为单个值
df.iloc[0,2],:]#选取第一行及第三行的数据
df.iloc[0:2,:]#选取第一行到第三行(不包含)的数据
df.iloc[:,1]#选取所有记录的第一列的值,返回的为一个Series
df.iloc[1,:]#选取第一行数据,返回的为一个Series
print(df.ix[1,1]) # 更广义的切片方式是使用.ix,它自动根据你给到的索引类型判断是使用位置还是标签进行切片
print(df.ix[0:2])


#DataFrame根据条件选取子集 类似于sas里面if、where ,R里面的subset之类的函数
df[df.Murder>13]
df[(df.Murder>10)&(df.Rape>30)]
df[df.sex==u\'男\']
#重命名 相当于sas里面的rename R软件中reshape包的中的rename
df.rename(columns={\'A\':\'A_rename\'}) 
df.rename(index={1:\'other\'})

#删除列 相当于sas中的drop R软件中的test[\'col\']<-null
df.drop([\'a\',\'b\'],axis=1) or del df[[\'a\',\'b\']]

#排序 相当于sas里面的sort R软件里面的df[order(x),]
df.sort(columns=\'C\') #行排序 y轴上
df.sort(axis=1) #各个列之间位置排序 x轴上

#数据描述 相当于sas中proc menas R软件里面的summary
df.describe()


#生成新的一列 跟R里面有点类似
df[\'new_columns\']=df[\'columns\']
df.insert(1,\'new_columns\',df[\'B\']) #效率最高
df.join(Series(df[\'columns\'],name=\'new_columns\'))


#列上面的追加 相当于sas中的append R里面cbind()
df.append(df1,ignore_index=True)
pd.concat([df,df1],ignore_index=True)

#最经典的join 跟sas和R里面的merge类似 跟sql里面的各种join对照
merge()

#删除重行 跟sas里面nodukey R里面的which(!duplicated(df[])类似
df.drop_duplicated()

#获取最大值 最小值的位置 有点类似矩阵里面的方法
df.idxmin(axis=0 ) df.idxmax(axis=1) 0和1有什么不同 自己摸索去

#读取外部数据跟sas的proc import R里面的read.csv等类似
read_excel() read_csv() read_hdf5() 等

与之相反的是df.to_excel() df.to_ecv()

#缺失值处理 个人觉得pandas中缺失值处理比sas和R方便多了
df.fillna(9999) #用9999填充

#链接数据库 不多说 pandas里面主要用 MySQLdb
import MySQLdb
conn=MySQLdb.connect(host="localhost",user="root",passwd="",db="mysql",use_unicode=True,charset="utf8")
read_sql() #很经典
#写数据进数据库
df.to_sql(\'hbase_visit\',con, flavor="mysql", if_exists=\'replace\', index=False)

#groupby 跟sas里面的中的by R软件中dplyr包中的group_by sql里面的group by功能是一样的 这里不多说

#求哑变量 
dumiper=pd.get_dummies(df[\'key\'])
df[\'key\'].join(dumpier)

#透视表 和交叉表 跟sas里面的proc freq步类似 R里面的aggrate和cast函数类似
pd.pivot_table()
pd.crosstab()

#聚合函数经常跟group by一起组合用
df.groupby(\'sex\').agg({\'height\':[\'mean\',\'sum\'],\'weight\':[\'count\',\'min\']})


#数据查询过滤
test.query("0.2
将STK_ID中的值过滤出来
stk_list = [\'600809\',\'600141\',\'600329\']中的全部记录过滤出来,命令是:rpt[rpt[\'STK_ID\'].isin(stk_list)].
将dataframe中,某列进行清洗的命令
删除换行符:misc[\'product_desc\'] = misc[\'product_desc\'].str.replace(\'\\n\', \'\')
删除字符串前后空格:df["Make"] = df["Make"].map(str.strip)


如果用模糊匹配的话,命令是:
rpt[rpt[\'STK_ID\'].str.contains(r\'^600[0-9]{3}$\')]


对dataframe中元素,进行类型转换

df[\'2nd\'] = df[\'2nd\'].str.replace(\',\',\'\').astype(int) df[\'CTR\'] = df[\'CTR\'].str.replace(\'%\',\'\').astype(np.float64)
#时间变换 主要依赖于datemie 和time两个包
http://www.2cto.com/kf/201401/276088.html

#其他的一些技巧
df2[df2[\'A\'].map(lambda x:x.startswith(\'61\'))] #筛选出以61开头的数据
df2["Author"].str.replace("<.+>", "").head() #replace("<.+>", "")表示将字符串中以”<”开头;以”>”结束的任意子串替换为空字符串

commits = df2["Name"].head(15)
print commits.unique(), len(commits.unique()) #获的NAME的不同个数,类似于sql里面count(distinct name)


#pandas中最核心 最经典的函数apply map applymap

#这三个函数是pandas里面数据变换的核心 避免了for循环,跟R里面的apply函数类似
#主要用法不清楚可以问我

pd.concat([df1,df2],axis=1) 横向合并 ,没有axis=1 则纵向合并

 

 

#   参考:  http://www.cnblogs.com/nxld/p/6058591.html

 

三、利用pandas查询数据

这里的查询数据相当于R语言里的subset功能,可以通过布尔索引有针对的选取原数据的子集、指定行、指定列等。我们先导入一个student数据集:

  1. student = pd.io.parsers.read_csv(\'C:\\\\Users\\\\admin\\\\Desktop\\\\student.csv\')

查询数据的前5行或末尾5行

  1. student.head()
  2. student.tail()

查询指定的行

  1. student.ix[[0,2,4,5,7]] #这里的ix索引标签函数必须是中括号[]

查询指定的列

  1. student[[\'Name\',\'Height\',\'Weight\']].head() #如果多个列的话,必须使用双重中括号

也可以通过ix索引标签查询指定的列

  1. student.ix[:,[\'Name\',\'Height\',\'Weight\']].head()

查询指定的行和列

  1. student.ix[[0,2,4,5,7],[\'Name\',\'Height\',\'Weight\']].head()

以上是从行或列的角度查询数据的子集,现在我们来看看如何通过布尔索引实现数据的子集查询。
查询所有女生的信息

  1. student[student[\'Sex\']==\'F\']

查询出所有12岁以上的女生信息

  1. student[(student[\'Sex\']==\'F\') & (student[\'Age\']>12)]

查询出所有12岁以上的女生姓名、身高和体重

  1. student[(student[\'Sex\']==\'F\') & (student[\'Age\']>12)][[\'Name\',\'Height\',\'Weight\']]

上面的查询逻辑其实非常的简单,需要注意的是,如果是多个条件的查询,必须在&(且)或者|(或)的两端条件用括号括起来。

四、统计分析

pandas模块为我们提供了非常多的描述性统计分析的指标函数,如总和、均值、最小值、最大值等,我们来具体看看这些函数:
首先随机生成三组数据

  1. np.random.seed(1234)
  2. d1 = pd.Series(2*np.random.normal(size = 100)+3)
  3. d2 = np.random.f(2,4,size = 100)
  4. d3 = np.random.randint(1,100,size = 100)
  5. d1.count() #非空元素计算
  6. d1.min() #最小值
  7. d1.max() #最大值
  8. d1.idxmin() #最小值的位置,类似于R中的which.min函数
  9. d1.idxmax() #最大值的位置,类似于R中的which.max函数
  10. d1.quantile(0.1) #10%分位数
  11. d1.sum() #求和
  12. d1.mean() #均值
  13. d1.median() #中位数
  14. d1.mode() #众数
  15. d1.var() #方差
  16. d1.std() #标准差
  17. d1.mad() #平均绝对偏差
  18. d1.skew() #偏度
  19. d1.kurt() #峰度
  20. d1.describe() #一次性输出多个描述性统计指标

必须注意的是,descirbe方法只能针对序列或数据框,一维数组是没有这个方法的

这里自定义一个函数,将这些统计描述指标全部汇总到一起:

  1. def stats(x):
  2. return pd.Series([x.count(),x.min(),x.idxmin(),
  3. x.quantile(.25),x.median(),
  4. x.quantile(.75),x.mean(),
  5. x.max(),x.idxmax(),
  6. x.mad(),x.var(),
  7. x.std(),x.skew(),x.kurt()],
  8. index = [\'Count\',\'Min\',\'Whicn_Min\',
  9. \'Q1\',\'Median\',\'Q3\',\'Mean\',
  10. \'Max\',\'Which_Max\',\'Mad\',
  11. \'Var\',\'Std\',\'Skew\',\'Kurt\'])
  12. stats(d1)

在实际的工作中,我们可能需要处理的是一系列的数值型数据框,如何将这个函数应用到数据框中的每一列呢?可以使用apply函数,这个非常类似于R中的apply的应用方法。
将之前创建的d1,d2,d3数据构建数据框:

  1. df = pd.DataFrame(np.array([d1,d2,d3]).T,columns=[\'x1\',\'x2\',\'x3\'])
  2. df.head()
  3. df.apply(stats)

非常完美,就这样很简单的创建了数值型数据的统计性描述。如果是离散型数据呢?就不能用这个统计口径了,我们需要统计离散变量的观测数、唯一值个数、众数水平及个数。你只需要使用describe方法就可以实现这样的统计了。

  1. student[\'Sex\'].describe()

除以上的简单描述性统计之外,还提供了连续变量的相关系数(corr)和协方差矩阵(cov)的求解,这个跟R语言是一致的用法。

  1. df.corr()

关于相关系数的计算可以调用pearson方法或kendell方法或spearman方法,默认使用pearson方法。

  1. df.corr(\'spearman\')

如果只想关注某一个变量与其余变量的相关系数的话,可以使用corrwith,如下方只关心x1与其余变量的相关系数:

  1. df.corrwith(df[\'x1\'])

数值型变量间的协方差矩阵

    1. df.cov()

以上是关于Python数据分析之pandas学习的主要内容,如果未能解决你的问题,请参考以下文章

Python数据分析之pandas学习

Python之Pandas学习

利用python数据分析panda学习笔记之Series

利用python数据分析panda学习笔记之DataFrame

利用python数据分析panda学习笔记之基本功能

学习 Python 之 Pandas库