python数据分析一周速成3.数据计算、分组聚合

本章来学习求和、求均值、方差等常用函数计算聚合函数、多函数的应用

一、聚合计算(推荐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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

噼里啪啦噼酷啪Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值