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