Pandas(二)描述统计与函数应用

 一、描述与统计

1.查看基本统计值

有时候我们获取到数据之后,想要查看下数据的简单统计指标(最大值、最小值、平均值、中位数等),比如想要查看年龄的最大值,如何实现呢?

直接对 age 这一列调用 max方法即可。类似的,通过调用 min、mean、quantile、sum 方法可以实现最小值、平均值、中位数以及求和。可以看到,对一个 Series 调用 这几个方法之后,返回的都只是一个聚合结果。

#函数
np.max(user_info.年龄)

#方法
user_info.年龄.mean()

如果想要获取更多的统计方法,可以参见官方链接:Descriptive statistics (http://pandas.pydata.org/pandas-docs/stable/basics.html#descriptive-statistics)

虽然说常见的各种统计值都有对应的方法,如果我想要得到多个指标的话,就需要调用多次方法,是不是显得有点麻烦呢?Pandas 设计者自然也考虑到了这个问题,想要一次性获取多个统计指标,只需调用 describe 方法即可。

# 只支持数值列
user_info.describe()

可以看到,直接调用 describe 方法后,会显示出数字类型的列的一些统计指标,如 总数、平均数、标准差、最小值、最大值、25%/50%/75% 分位数。

如果想要查看非数字类型的列的统计指标,可以设置 include=["object"] 来获得。

user_info.describe(include=["float64"])

2.统计下某列中每个值出现的次数value_counts

user_info['中青年'].value_counts()

user_info.性别.value_counts()

这个非常重要,后面会经常用到。

3.离散化

有时候,我们会碰到这样的需求,想要将年龄进行离散化(分桶),直白来说就是将年龄分成几个区间,这里我们想要将年龄分成 3 个区间段。就可以使用 Pandas 的 cut 方法来完成。

# bins 整数,代表了均匀切分,等宽分箱
pd.cut(grade.语文,3)


#有时候离散化之后,想要给每个区间起个名字,可以指定 labels 参数
pd.cut(grade.语文,3,labels=['低分','中等','高分'])

可以看到, cut 自动生成了等距的离散区间,如果自己想定义也是没问题的。

# bins 如果是一个序列, 代表指定切分位置
# 0-60   60 - 100  100 - 150
# right = False  代表左侧闭区间 ,右侧开区间
pd.cut(grade.数学 , [-1 , 60 , 100, 151] , right =False )

除了可以使用 cut 进行离散化之外,qcut 也可以实现离散化。cut 是根据每个值的大小来进行离散化的,qcut 是根据每个值出现的次数来进行离散化的。有时候等宽分箱,当样本分布不是很均匀的时候,结果不是很好,换成等深分箱,这样切分出的样本数是差不多的。

# pd.qcut 等深分箱  , 保证分箱之后的区间中样本个数大体相等
pd.qcut(grade.语文, 3)
pd.qcut(grade.语文, 3).value_counts()

4.排序功能

在进行数据分析时,少不了进行数据排序。Pandas 支持两种排序方式:按轴(索引或列)排序和按实际值排序。

1)按索引排序

sort_index 方法默认是按照索引进行正序排的。

2)按值排序

如果想要实现按照实际值来排序,例如想要按照年龄排序,如何实现呢?

使用 sort_values 方法,设置参数 by="***" 即可。

# 降序排序
eng.sort_values(ascending=False)
# 按照英语进行排序
grade.sort_values(by = '英语' , ascending=False)

有时候我们可能需要按照多个值来排序,例如:按照年龄和城市来一起排序,可以设置参数 by 为一个 list 即可。注意:list 中每个元素的顺序会影响排序优先级的.

# 按照英语进行排序 , 英语分数相同的, 以数学进行排序
grade.sort_values(by =[ '英语', '数学'] , ascending=False)

二、函数应用

 1.map

map函数非常重要,学好了,半壁江山就拿下了。

 

map()函数是python内置的高阶函数,对传入的list的每一个元素进行映射,返回一个新的映射之后的list

python3中,map函数返回的是一个map对象,需要list(map(fun,itor))来将映射之后的map对象转换成列表

 2.applymap

applymap 方法针对于 DataFrame,它作用于 DataFrame 中的每个元素,它对 DataFrame 的效果类似于 apply 对 Series 的效果。

def f(x):
#     print(type(x))
#     print(x)
#     print("-----")
    if type(x) == int: # 传进来的是数值
        return x * 2
    elif type(x) == str:
        return x * 3
grade3 = grade[['语文','姓氏']]
grade3

grade3.applymap(f)

三、表合并

# 直接在后面追加新的数据
grade_one.append(grade_two)
# 一次性拼接多个表, 使用新的索引
grade_one.append(  [grade_two , grade_one ,grade_two] ,
                 ignore_index=True)
# 竖着拼接  和append一样
pd.concat([grade_one , grade_two])
# 横向拼接  以行索引进行拼接
pd.concat([grade_one , grade_two] , axis=1)
# 横向拼接  以行索引进行拼接 , 内连接 ,只保留拼接成功的数据
pd.concat([grade_one , grade_two] ,join='inner', axis=1)

第三个就是数据库拼接

# 默认内连接  相当于并集
pd.merge(grade_one , test ,left_on='姓名' , right_on='学生姓名')
# 外连接  相当于交集
pd.merge(grade_one , test ,left_on='姓名' , right_on='学生姓名',
        how='outer')
# 左连接 左表有的都有
pd.merge(grade_one , test ,left_on='姓名' , right_on='学生姓名',
        how='left')
# 右连接 右表有的都有
pd.merge(grade_one , test ,left_on='姓名' , right_on='学生姓名',
        how='right')

重点:1. 描述统计 2. 离散化 3. 排序 4. 函数map ,applymap  5. 表合并 

Pandas 不需要很多的逻辑思考,英文看懂,明白参数设置,用到的时候会查就行了。

原文地址:https://www.cnblogs.com/BC10/p/11683570.html