python学习-pandas通用函数与运算

DataFrame、Series、标量之间的算术运算

DataFrame元素级的函数运算

◆ 通过numpy的一元通用函数ufunc实现

◆ 格式为:np.ufunc(df)

分析同学的“身体质量”,即BMI(Body Mass Index)指数

>>> stu['BMI'] = stu['体重'] / ( np.square(stu['身高']/100) ) #增加BMI列

>>> stu['月生活费'].quantile( [.25, .75] )#计算月生活费的上、下四分位数

描述统计函数describe() 一次计算多项统计值

>>> stu[['身高','体重','成绩']].describe() #对身高体重和成绩3列数据描述统计

分组

根据某些索引将数据对象划分为多个组

◆ 对每个分组进行排序或统计计算

grouped = obj.groupby(col)

grouped.aggregate({'col1':f1, 'col2':f2,...})

同学数据中的“身高、月生活费”按“性别”和“年龄”进行分组 分析

>>> grouped = stu.groupby(['性别', '年龄'])

>>> grouped.aggregate( {'身高':np.mean, '月生活费':np.max } )#内部为字典格式

统计函数crosstab() 类似Excel交叉表

◆ 按照给定的第一列分组,对第二列计数

>>> pd.crosstab( stu['性别'], stu['月生活费']) #pandas函数

相关性分析

相关系数分类

Pearson简单相关系数(皮尔逊)

⚫ 用来度量正态分布的定距变量间的线性相关关系

⚫ Pearson简单相关系数要求变量来自的总体 分布正态

Spearman秩相关系数(斯皮尔曼)

⚫ 采用非参数检验方法来度量定序变量间的线性相关关系

⚫ 不要求总体正态分布

◆ 卡方

⚫ 采用非参数检验方法来度量分类变量间的相关关系

研究不同总体之间是否存在依存关系

◆ 绘制散点图矩阵,能直观地观察列之间的相关性

⚫ pd.plotting.scatter_matrix(data,diagonal='kde',color=‘r') #绘图pandas方法

◆ 计算样本之间的相关系数 r 推断总体的相关程度

当样本容量较大(≥30)时,相关性分析判断准确性较高

DataFrame相关性分析函数 DataFrame.corr()

#两列数据之间的相关性

>>> stu['身高'].corr( stu['体重'] )

0.67573990985276822

#多列数据之间的相关性

>>> stu[ ['身高','体重','成绩 '] ].corr()

         身高 体重 成绩

身高 1.000000 0.675740 0.080587

体重 0.675740 1.000000 -0.072305

成绩 0.080587 -0.072305 1.000000

相关系数具有以下特征

◼ 相关系数的值介于–1与+1之间;

◼ r=1:两个总体正相关;r=0:不相关;r=-1:负相关;

◼ |r|<0.3:低度相关;0.3≤|r|<0.8:中等相关;0.8≤|r|<1:高度相关。

偏相关性分析

在多元相关分析中,由于受到其他变量的影响,在计算某两个变量之间的 相关系数时,得到的结果往往不能真实反映变量之间的相关关系,所以在多元相关分析中,通常将其他变量固定(控制),而计算某两个变量之 间的相关系数,称为偏相关系数。

偏相关分析用于计算变量之间的偏相关系数,可以判断自变量对因变量的 影响程度,舍弃影响较小的自变量,保留影响较大的自变量,从而更准确 地判断变量之间的相关关系和相关程度。

DataFrame偏相关性分析函数

DataFrame.pcorr()

偏相关性分析案例

案例-调查反馈

对50名学生进行抽样调查,10人一组相同问卷,反馈数据保存在studentInfo.xlsx文件 的5张表中。综合5组数据实现以下分析目标:

• 男、女生对《数据科学》课程的兴趣程度和成绩的变化趋势;

• 学生来自的省份以及性别与成绩是否存在关系;

• 学生身高、体重达标状况。

步骤1:导入所需的方法库

import pandas as pd

import numpy as np

from pandas import Series, DataFrame

步骤2:从Excel文件的5张表中读取数据,拼接为一个DataFrame对象

#从Excel文件的5张表中读取数据 df1=pd.read_excel('data\studentsInfo.xlsx','Group1',index_col=0) df2=pd.read_excel('data\studentsInfo.xlsx','Group2',index_col=0) df3=pd.read_excel('data\studentsInfo.xlsx','Group3',index_col=0) df4=pd.read_excel('data\studentsInfo.xlsx','Group4',index_col=0) df5=pd.read_excel('data\studentsInfo.xlsx','Group5',index_col=0)

#按行追加形式,拼接数据集

stu = pd.concat([df1,df2,df3,df4,df5], axis = 0) print( 'Data Size:', stu.shape )

步骤3:去除完全重复以及缺失项较多(≥2)的数据行,检测是否还有缺 失数据 stu.drop_duplicates(inplace = True) #去除重复行,更新方式

stu.dropna(thresh=8,inplace = True )#去除有缺失数据行,更新方式

print( 'Data Size after drop:', stu.shape ) print( "Nan Columns:\n",stu.isnull().any() ) #缺失数据列检测

➢ stu.isnull()检测对象每个值是否是NaN,得到布尔型 DataFrame。

➢ any()函数缺省按列检测是否全为False,不是返回 True,得到布尔型的Series对象。

步骤4:填充缺失值:成绩按照平均分填充;接受调查同学为二年级,用默认 值“20”来填充 stu.fillna({'年龄':20, '成绩':stu['成绩'].mean()}, inplace=True ) print( "Nan Columns:\n",stu.isnull().any() )

步骤5:将同学数据按照“成绩”排序,统计优秀(≥90)和不合格(<60) 学生个数。并分别计算优秀与不合格同学的平均课程兴趣度,以及全体同学 课程的平均分与课程兴趣度

#按照成绩排序 stu_grade = stu.sort_values(by='成绩', ascending=False) ex = (stu_grade['成绩']>=90 ).sum() #计算优秀人数 fail = (stu_grade['成绩']<60 ).sum() #计算不及格人数 print("Excellent: {}, Fail: {}".format(ex,fail))

条件表达式stu_grade[‘成绩’]>=90 得到布尔型Series对象,sum() 函数统计其中True的个数

◆ 优秀9个,不及格4个

ex_mean = stu_grade[0:9][['成绩','课程兴趣']].mean() #前9行优秀

total_mean = stu_grade[['成绩','课程兴趣']].mean() fail_mean = stu_grade[-4:][['成绩','课程兴趣']].mean() #后4行不及格

print("ex_mean:\n", ex_mean, "\ntotal_mean\n",total_mean, "\nfail_mean\n", fail_mean)

#计算两列相关度

print( stu_grade['成绩'].corr(stu_grade['课程兴趣']) )

结果表明:

1)3类统计“成绩”均值为93.8、76.3和46.0,而“课程兴趣”的均值为5.0、4.2和3.0

2)从趋势上看,大学课程学习的成绩与兴趣的变化具有一致性

3)两列数据的相似度为0.44,说明从个体上两者相关度并不是特别高,也有可能存在错误数据

步骤6:分析性别、省份与成绩是否存在相关性,由于性别和省份数据均为字符型 (分类型),无法用corr()函数来计算。简单的方法是分组计算均值:

sex_grouped = stu.groupby(['性别'])

sex_counts = sex_grouped.count() #统计每个分组的行数

#分组统计成绩平均值

sex_mean = stu.groupby(['性别']).aggregate( {'成绩':np.mean } )

print(sex_counts, '\n', sex_mean)

pro_counts = stu.groupby(['省份']).count()

pro_mean = stu.groupby(['省份']).aggregate( {'成绩':np.mean } )

print(pro_counts, '\n', pro_mean)

结果表明: 1)男、女同学的各24人,平均成绩分别是79.0和73.7 2)说明男同学在该门课程中成绩更好一些。 3)按省份分组,各省平均分相去甚远,但观察每个省份只有1~3名同学,分组样本太少,导致分析结 果不具参考价值

步骤7:计算同学的BMI值,找出各个四分位数,并与国家标准进行比较:

stu['BMI'] = stu['体重'] / ( np.square(stu['身高']/100) )

#计算四分位数

print( stu['BMI'].quantile( [.25,0.5,.75] ) )

#计算BMI值>28的个数

print('BMI>28 肥胖人数:', (stu['BMI']>=28 ).sum() )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚公移山山不移

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值