W
e
l
c
o
m
e
: )

04.Pandas统计分析

统计分析:

方法 概述
count 非空数目
series 频数统计
mode 众数
describe 数据的范围。大小、波动趋势等,便于判断后续对数据采取哪类模型更合适。
astype 将数值型转为类别型astype
groupby 分组,对表格进行拆分分组,返回的是分组对象
reset_index 可以还原索引,重新变为默认的整型索引
agg 聚合
apply 聚合,不能对 不同列进行使用,很少用
transform 参数可以传递任何函数

构建数据

columns = ['姓名', '年龄', '班级', '电话号码', '学号', '成绩']
data = [['码云', 40, 101, '1123131123321', '001', 120], ['李佳乘', 80, 102, '13123213321', '002', 130],
        ['麻花腾', 40, 102, '1123131123321', '003', 100],
        ['麻花腾', 40, 101, '1123131123321', '003', 89]]

df = pd.DataFrame(columns=columns, data=data)

1.非空数目

print(df['年龄'].count())

#
3

2.频数统计

print(df['年纪'].value_counts())

3.众数

print(df['年纪'].mode())

4.describe

数据的范围。大小、波动趋势等,便于判断后续对数据采取哪类模型更合适。

print(df['年龄'].describe())

#
count     3.000000
mean     53.333333
std      23.094011
min      40.000000
25%      40.000000
50%      40.000000
75%      60.000000
max      80.000000
Name: 年龄, dtype: float64

5.astype

将数值型转为类别型astype

print(df['性别'].astype('category').describe())

# 
count     3
unique    1
top       1
freq      3
Name: 性别, dtype: int64

6.groupby

分组,对表格进行拆分分组,返回的是分组对象

源码参数介绍

def groupby(self, by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs):

  • by:接收list,string,mapping或generator。用于确定进行分组的依据。无默认

  • axis:接收int。表示操作的轴向,默认对列进行操作。默认为0

  • level:接收int或者索引名。代表标签所在级别。默认为None

  • as_index:接收boolearn。表示聚合后的聚合标签是否以DataFrame索引形式输出。默认为True

  • sort:接收boolearn。表示是否对分组依据分组标签进行排序。默认为True

  • group_keys:接收boolearn。表示是否显示分组标签的名称。默认为True

  • squeeze:接收boolearn。表示是否在允许的情况下对返回数据进行降维。默认为False

  • by参数说明

    • 如果传入的是一个函数则对索引进行计算并分组。
    • 如果传入的是一个字典或者Series则字典或者Series的值用来做分组依据。
    • 如果传入一个NumPy数组则数据的元素作为分组依据。
    • 如果传入的是字符串或者字符串列表则使用这些字符串所代表的字段作为分组依据。

构建数据

columns = ['姓名', '年龄', '班级', '电话号码', '学号', '成绩']
data = [['码云', 40, 101, '1123131123321', '001', 120], ['李佳乘', 80, 102, '13123213321', '002', 130],
        ['麻花腾', 40, 102, '1123131123321', '003', 100],
        ['麻花腾', 40, 101, '1123131123321', '003', 89]]

df = pd.DataFrame(columns=columns, data=data)
score_data = df.loc[:, ['班级', '年龄', '成绩']]
# 分组聚合
group_data = score_data.groupby(by='班级')
print(group_data)

# 可以看到结果是一个 分组对象
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000028E0FDB5128>

7.reset_index

可以还原索引,重新变为默认的整型索引

group_data = score_data.groupby(by='班级')
print(score_data.mean())
print('-------------')
print(group_data.mean().reset_index())


#  可以看到 结果已经按照原本的样式 
班级    101.50
成绩    109.75
年龄     50.00
dtype: float64
-------------
    班级     成绩    年龄
0  101  104.5  40.0
1  102  115.0  60.0

8.聚合

1.对不同列,进行相同的统计方法

直接在列表重写,需要执行的函数即可

score_data = df.loc[:, ['班级', '成绩','年龄']]
print(score_data.agg([np.sum,np.mean]))


# 
         班级      成绩     年龄
sum   406.0  439.00  200.0
mean  101.5  109.75   50.0

2.对不同列,执行不同的统计方法

使用字典,对每一个列执行不同的方法,如果需要对当列执行不同的方法,使用列表即可。

score_data = df.loc[:, ['班级', '成绩','年龄']]
print(score_data.agg({'成绩': np.mean, '年龄': [np.mean, np.std]}))

          成绩    年龄
mean  109.75  50.0
std      NaN  20.0

apply 聚合函数

对groupby对象使用相同的方法

print(score_data.apply(np.mean))


#
班级    101.50
成绩    109.75
年龄     50.00
dtype: float64

transform 重点很强大

前面进行聚合运算的时候,得到的结果是一个以分组名作为索引的结果对象。虽然可以指定 as_index=False ,但是得到的索引也并不是元数据的索引。如果我们想使用原数组的索引的话, 就需要进行 merge 转换

  transform 方法简化了这个过程,它会把 func 参数应用到所有分组,然后把结果放置到原数组的 索引上(如果结果是一个标量,就进行广播)

print(score_data[['成绩','年龄']])
print('------------')
print(score_data[['成绩', '年龄']].transform(lambda x: x * 2))  
  
# 可以看到这边我们对每一个 数据都进行 lambda 函数 操作
    成绩  年龄
0  120  40
1  130  80
2  100  40
3   89  40
------------
    成绩   年龄
0  240   80
1  260  160
2  200   80
3  178   80

posted @ 2020-03-10 21:59  水一RAR  阅读(225)  评论(0编辑  收藏  举报