本章来学习求和、求均值、方差等常用函数计算,聚合函数、多函数的应用
一、聚合计算(推荐describe多维展示)
聚合计算:汇总统计。常用:均值 mean 求和 sum 最大值 max 最小值 min 计数count
1.1 常用函数
import numpy as np
import pandas as pd
d=np.array([
[1,12,13,15,16],
[23,28,24,215,26],
[370,39,355,325,3],
[47,49,45,42,482],
[571,519,5,52,57],
[61,69,68,6,67]
])
df=pd.DataFrame(data=d,columns=list('abcde'),index=list('123456')) #index行名,columns列名;每列类型是series,整体是DF
# df=type(df[0:1]) #df[行索引值]取行数
df
######################################## 知识回顾:函数维度查询
df.info() # 数据基本信息
df.shape # 数据集的行数和列数
df.describe() # 描述性统计,较全维度:个数df.a.count() 平均数df['a'].mean() 方差var 最小值min、25 50分位中位数median 75分位、最大值max
######################################## 对某一列进行【聚合计算】
df['a'].count() #计数;若不加count后括号,则输出类型method
df.a.mean() #输出均值。与 df.a.mean()效果一样,输出numpy类型
df['a'].var() #方差
df['a'].max() #最大值
df['a'].min() #最小值
df['a'].median() #中位数
df.a.sum() #求和
df['a'].cumsum() #按行累计求和
df['a'].cumprod() #按行累计求和
df['a'].skew() #偏度
df['a'].kurt() #峰度
df['a'].diff() #差分
df['a'].mad() #平均绝对偏差
df.sum(axis=0) #按列求和,汇总到最后一行,axis=0纵向,axis=1横向
df.sum(axis=1) #按行求和,汇总到最后一列
1.2 agg:多函数
#使用多个聚合函数:agg
df.agg(['sum','mean','std','min']) #应用于整个DF
df.agg({'a':['sum','mean'],'b':['std'],'c':['var']}) #不同列应用不同函数
1.3 apply(高频使用:对series或DF,按行列批量计算)
df.apply(lambda x:x.max()-x.min(),axis=1) # apply:对DF或series进行列行的批量操作。axis=1按行(横向)找最大值,减去最小值,把结果新建一列存储
1.4 map(高频使用:计算series每个单元格值)
df.a.map(lambda x:1 if x>60 else 0 ) # map:对series的每个值进行计算,若>60输出x冒号后的值,反之输出0
1.5 applymap(不常用,计算DF每个单元格值)
df.applymap(lambda x:1 if x>60 else 0 ) # applymap:对DF的每个单元格值进行计算(此函数不适配python新版本,需下载pandas==1.3.2)
二、分组
2.1 数据准备
import numpy as np
import pandas as pd
d=np.array([
['a',12,13,15,16],
['a',12,24,215,26],
['a',39,355,325,3],
['b',39,45,42,482],
['b',69,5,52,57],
['b',69,68,6,67]
])
df=pd.DataFrame(data=d,columns=list('abcde'),index=list('123456'))
df
# '''
# a b c d e
# 1 a 12 13 15 16
# 2 a 12 24 215 26
# 3 a 39 355 325 3
# 4 b 39 45 42 482
# 5 b 69 5 52 57
# 6 b 69 68 6 67
# '''
# 先转换数据类型(二选一),不然会出现字符串'45'顺序比'5'小的异常结果
df[['b', 'c', 'd', 'e']] = df[['b', 'c', 'd', 'e']].astype(int) # 将多列转换为整数类型
df = df.astype({'c': int}) # 或者,仅将列'c'转换为整数类型
2.2 分组、聚合
先分组,后聚合:groupby( ).agg()
df.groupby('a').agg({'c':'min','d':'max'}).rename(columns={'c':'c_min','d':'d_max'}) #单列分组+多个聚合函数
df.groupby(['a','b']).sum() #多列分组
df.groupby(['a','b']).agg({'c':'min','d':'max'}).rename(columns={'c':'c_min','d':'d_max'}) #多列分组+多个聚合函数
2.3 自定义函数 def…return…
def custom_agg(x):
return x.max() - x.min()
result = df[['b','c']].groupby('b').agg({'c':custom_agg})
result
2.4 开窗函数 transform
功能类似SQL的over… partition by…
df['new']=df[['b','c']].groupby('b')['c'].transform('mean') #对b列分组聚合,对c列求平均值
df
'''
a b c d e new
1 a 12 13 15 16 18.5
2 a 12 24 215 26 18.5
3 a 39 355 325 3 200.0
4 b 39 45 42 482 200.0
5 b 69 5 52 57 36.5
6 b 69 68 6 67 36.5
'''
2.5 文本分组 lambda…join…
**写入DF时,何时在columns或index里用list():**当d= (‘元祖1’,‘元祖2’)时可用list()转换为列表
d=[['张三','语文']
,['张三','数学']
,['张三','英语']
, ['李四','语文']
,['李四','数学']
,['李四','英语']
]
# df=pd.DataFrame(data=d,columns=list(d_tuple) ) #何时用list:当d=('元祖1','元祖2')
df=pd.DataFrame(data=d,columns=['姓名','科目'])
df
(df.astype(str) #数据转换为字符
.groupby('姓名') #分组
.agg(lambda x:','.join(x)) # ① lambda 参数列表 : 表达式(仅支持一个) ② join连接元素
)['科目']
'''
姓名 科目
张三 语文,数学,英语
李四 语文,数学,英语
'''
知识补充:lambda的使用
**公式:**lambda 参数列表(可多参,也可为空) : 表达式(仅支持一个)
add = lambda x, y: x + y
print(add(3, 5)) # 输出:8
square = lambda x: x ** 2
print(square(5)) # 输出:5的平方25
# 结合map()映射
numbers = [1, 2, 3]
squared = list(map(lambda x: x**2, numbers)) # 输出:[1, 4, 9]
# 结合filter()过滤
even = list(filter(lambda x: x % 2 == 0, numbers)) # 输出余数为0的:[2]
# 结合sorted()排序,sorted(iterable如列表、元祖等可迭代的参数,key= None关键字参数,指定排序依据,默认比较元素本身,reverse= False默认降序)
words = ["apple", "banana", "cherry"]
sorted_words = sorted(words, key= lambda x: len(x)) # 按长度排序输输出:['apple', 'banana', 'cherry']
sorted_words
8181

被折叠的 条评论
为什么被折叠?



