一、描述与统计
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 不需要很多的逻辑思考,英文看懂,明白参数设置,用到的时候会查就行了。