模块为我们提供了非常多的描述性统计分析的指标函数,如总和、均值、最小值、最大值等,我们来具体看看这些函数:
1、随机生成三组数据
import numpy as np
import pandas as pd
np
.random.seed(
1234)
d1 = pd
.Series(
2*np
.random.normal(size =
100)+
3)
d2 = np
.random.f(
2,
4,size =
100)
d3 = np
.random.randint(
1,
100,size =
100)
1234567
2、统计分析用到的函数
d1
.count()
#非空元素计算
d1
.min()
#最小值
d1
.max()
#最大值
d1
.idxmin()
#最小值的位置,类似于R中的which.min函数
d1
.idxmax()
#最大值的位置,类似于R中的which.max函数
d1
.quantile(
0.1)
#10%分位数
d1
.sum()
#求和
d1
.mean()
#均值
d1
.median()
#中位数
d1
.mode()
#众数
d1
.var()
#方差
d1
.std()
#标准差
d1
.mad()
#平均绝对偏差
d1
.skew()
#偏度
d1
.kurt()
#峰度
d1
.describe()
#一次性输出多个描述性统计指标
12345678910111213141516
必须注意的是,descirbe方法只能针对序列或数据框,一维数组是没有这个方法的
自定义一个函数,将这些统计指标汇总在一起:
def status(x) :
return pd.Series([x.count(),x.min(),x.idxmin(),x.quantile(
.25),x.median(),
x.quantile(
.75),x.mean(),x.max(),x.idxmax(),x.mad(),x.var(),
x.std(),x.skew(),x.kurt()],index=[
'总数',
'最小值',
'最小值位置',
'25%分位数',
'中位数',
'75%分位数',
'均值',
'最大值',
'最大值位数',
'平均绝对偏差',
'方差',
'标准差',
'偏度',
'峰度'])
12345
执行该函数,查看一下d1数据集的这些统计函数值:
df =
pd.DataFrame(status(d1))
df
12
结果:
在实际的工作中,我们可能需要处理的是一系列的数值型数据框,如何将这个函数应用到数据框中的每一列呢?可以使用apply函数,这个非常类似于R中的apply的应用方法。 将之前创建的d1,d2,d3数据构建数据框:
df = pd.DataFrame(np.
array([d1,d2,d3]).T, columns=[
'x1',
'x2',
'x3'])
df.head()
df.apply(status)
1234
结果:
3、加载CSV数据
import numpy
as np
import pandas
as pd
bank = pd.read_csv(
"D://bank/bank-additional-train.csv")
bank.head()
12345
描述性统计1:describe()
result = bank[
'age'].describe()
pd.DataFrame(
result )
12
描述性统计2:describe(include=[‘number’])
include中填写的是数据类型,若想查看所有数据的统计数据,则可填写
object,即
include=[
'object'];若想查看
float类型的数据,则为
include=[
'float']。
12
result = bank.describe(
include=[
'object'])
1
含义:
count:指定字段的非空总数。unique:该字段中保存的值类型数量,比如性别列保存了男、女两种值,则unique值则为2。top:数量最多的值。freq:数量最多的值的总数。
bank.describe(
include=[
'number'])
1
连续变量的相关系数(corr)
bank
.corr()
1
协方差矩阵(cov)
bank
.cov()
1
删除列
bank.drop(
'job', axis=
1)
1
排序
bank.sort_values(
by=[
'job',
'age'])
bank.sort_values(
by=[
'job',
'age'],
ascending=False)
12
多表连接
准备数据:
import numpy
as np
import pandas
as pd
student = {
'Name':[
'Bob',
'Alice',
'Carol',
'Henry',
'Judy',
'Robert',
'William'],
'Age':[
12,
16,
13,
11,
14,
15,
24],
'Sex':[
'M',
'F',
'M',
'M',
'F',
'M',
'F']}
score = {
'Name':[
'Bob',
'Alice',
'Carol',
'Henry',
'William'],
'Score':[
75,
35,
87,
86,
57]}
df_student = pd.DataFrame(student)
df_student
df_score = pd.DataFrame(score)
df_score
123456789101112131415
student:
score:
内连接
stu_score1 = pd.
merge(df_student, df_score,
on='Name')
stu_score1
12
注意,默认情况下,merge函数实现的是两个表之间的内连接,即返回两张表中共同部分的数据。可以通过how参数设置连接的方式,left为左连接;right为右连接;outer为外连接。
左连接
stu_score2 = pd.
merge(df_student, df_score,
on='Name',how='left')
stu_score2
12
左连接中,没有Score的学生Score为NaN
缺失值处理
现实生活中的数据是非常杂乱的,其中缺失值也是非常常见的,对于缺失值的存在可能会影响到后期的数据分析或挖掘工作,那么我们该如何处理这些缺失值呢?常用的有三大类方法,即删除法、填补法和插值法。
删除法
当数据中的某个变量大部分值都是缺失值,可以考虑删除改变量;当缺失值是随机分布的,且缺失的数量并不是很多是,也可以删除这些缺失的观测。
替补法
对于连续型变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值;如果变量是有偏的,可以使用中位数来代替那些缺失值;对于离散型变量,我们一般用众数去替换那些存在缺失的观测。
插补法
插补法是基于蒙特卡洛模拟法,结合线性模型、广义线性模型、决策树等方法计算出来的预测值替换缺失值。
此处测试使用上面学生成绩数据进行处理
查询某一字段数据为空的数量
sum(pd.isnull(stu_score2['Score']))
结果:2
12
直接删除缺失值
stu_score2
.dropna()
1
删除前: 删除后:
默认情况下,dropna会删除任何含有缺失值的行
删除所有行为缺失值的数据
import numpy as np
import pandas as pd
df = pd.DataFrame(
[[1,2,3],[3,4,np.nan],
[12,23,43],[55,np.nan,10],
[np.nan,np.nan,np.nan],[np.nan,1,2]],
columns=[
'a1',
'a2',
'a3'])
1234567
df
.dropna()
#该操作会删除所有有缺失值的行数据
1
df.dropna(how=
'all')
1
填充数据
使用一个常量来填补缺失值,可以使用fillna函数实现简单的填补工作:
1、用0填补所有缺失值
df
.fillna(
0)
1
2、采用前项填充或后向填充
df.fillna(
method='ffill') #用前一个值填充
1
df.fillna(
method='bfill') #用后一个值填充
1
3、使用常量填充不同的列
df.fillna({
'a1':
100,
'a2':
200,
'a3':
300})
1
4、用均值或中位数填充各自的列
a1_median = df[
'a1'].median()
a1_median=
7.5
a2_mean = df[
'a2'].mean()
a2_mean =
7.5
a3_mean = df[
'a3'].mean()
a3_mean =
14.5
df.fillna({
'a1':a1_median,
'a2':a2_mean,
'a3':a3_mean})
12345678910
很显然,在使用填充法时,相对于常数填充或前项、后项填充,使用各列的众数、均值或中位数填充要更加合理一点,这也是工作中常用的一个快捷手段。
数据打乱(shuffle)
实际工作中,经常会碰到多个DataFrame合并后希望将数据进行打乱。在pandas中有sample函数可以实现这个操作。
df =
df.sample(frac=1)
1
这样对可以对df进行shuffle。其中参数frac是要返回的比例,比如df中有10行数据,我只想返回其中的30%,那么frac=0.3。
有时候,我们可能需要打混后数据集的index(索引)还是按照正常的排序。我们只需要这样操作
df = df.sample(frac=1).reset_index(
drop=True)
转载于http://blog.csdn.net/A632189007/article/details/76176985