python数据分析——分组操作2

参考资料:活用pandas库

1、转换

        转换数据时,需要把DataFrame中的值传递给一个函数,而后由该函数“转换”数据。在《python数据分析——分组操作1》讲过aggregate接收多个值并返回单个(聚合)值。与aggregate不同,transform接收多个值,但返回的是与这些值一一对应的转换值,即transform方法不会减少数据量。

(1)计算z分数

        z分数能如实反映一个给定分数距离平均数的标准差。它的中心0,标准差是1.这种方法能把数据标准化,便于比较不同变量。

z=\frac{x-\mu}{\sigma }

        x为数据集中的数据点。

        μ为数据集的平均值。

        σ是标准差。

# 导入库
import pandas as pd

# 导入数据集
df=pd.read_csv(r"...\data\gapminder.tsv",sep='\t')


# zscore转换方法一
# 创建自定义函数
def my_zscore(x):
    """
    计算给定数据的z分数,
    是一个向量或值序列
    """
    return (x-x.mean())/x.std()
# 使用此自定义函数按组转换数据
transform_z=df.groupby('year').lifeExp.transform(my_zscore)
# 请注意,原DataFrame和transform_z的行数和数据的数量相同
# 输出数据的函数
print(df.shape)
# 输出转换之后值得个数
print(transform_z.size)
print(transform_z.shape)


# zscore转换方法二
# 使用scipy库中的zscore
# 从scipy.stats 导入zscore函数
from scipy.stats import zscore
# 计算分组的zscore
sp_z_grouped=df.groupby('year').lifeExp.transform(zscore)

# 两种方式获得的z分值略有差异,但均可用
# 输出transform_z的z分值
print(transform_z.head())
# 输出sp_z_grouped的z分值
print(sp_z_grouped.head())

(2)缺失值填充

        可以根据python数据分析——缺失数据-CSDN博客中的fillna方法对缺失数据进行填充。对于某些数据集,使用列的平均值来填充缺失值是可取的。而对于另一些数据集,根据特定组填充数据可能更好。

# 导入numpy库
import numpy as np
# 设置随机种子
np.random.seed(42)

# 读入数据
tips=pd.read_csv(r"...\seaborn常用数据案例\tips.csv")
# 从tips中抽取10个
tips_10=tips.sample(10)
# 随机挑选4个‘total_bill’创制缺失值
tips_10.loc[np.random.permutation(tips_10.index)[:4],'total_bill']=np.nan
print(tips_10)

# 查看缺失值数量
# 按sex统计非缺失值的数量
count_sex=tips_10.groupby('sex').count()
print(count_sex)

# 自定义函数
def fill_na_mean(x):
    """
    返回向量,将原向量的缺失值填充为向量的均值
    """
    avg=x.mean()
    return (x.fillna(avg))
# 按sex计算total_bill平均值
total_bill_group_mean=tips_10.\
groupby('sex').\
total_bill.\
transform(fill_na_mean)
# 可以在原始数据中创建新列
# 也可以直接使用total_bill替换原始列
tips_10['fill_total_bill']=total_bill_group_mean
print(tips_10)

2、过滤器

        使用groupby方法还可以过来数据。它支持按键拆分数据,然后对数据执行某种布尔子集运算。

# 使用tips数据
# 查看原始数据的行数
print(tips.shape)
# 查看不同规模聚餐的次数
print(tips['size'].value_counts())
# 在分组运算的基础上使用filter方法实现数据的过滤
# 过滤数据,保留每组包含30个或更多观测值的组
tips_filtered=tips.groupby('size').filter(lambda x: x['size'].count()>=30)
print(tips_filtered.shape)
print(tips_filtered['size'].value_counts())

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值