Pandas中如何对每个分组应用apply函数_18

在这里插入图片描述

import pandas as pd
import numpy as np

"""
本节主要介绍pandas怎样对每个分组应用apply函数

groupby.apply(function)
1.function的第一个参数是dataframe
2.function的返回结果,可以是dataframe、series、单个值,甚至可以是和dataframe输入完全没关系

本节展示:
1.怎样对数值列按分组的归一化
2.怎样取每个分组的topn数据
"""

# 一.怎样对数值列按分组的归一化
ratings = pd.read_csv(
    './rating.csv',
    sep='::',
    engine='python',
    names='UserID::MovieID::Rating::Timestamp'.split('::')
)

# 实现按照用户ID分组,然后对其中一列进行归一化的函数
def rating_norm(df):
    """
    :param df: 每个用户分组的dataframe
    :return:添加新列后的dataframe
    """
    min_value = df['rating'].min()
    max_value = df['rating'].max()
    df['rating_norm'] = df['rating'].apply(lambda x : (x-min_value)/(max_value-min_value))
    return df

# 对UserID进行分组,然后进行归一化
ratings = ratings.groupby('UserID').apply(rating_norm)
print(ratings[ratings['UserID']==1].head())

# 二、实现取每个分组的topn数据
"""
获取2018年每个月温度最高的2天数据
"""
fpath = './test.csv'
df = pd.read_csv(fpath)
# 去掉温度的C符号,并转为整数
df.loc[:,'bwendu'] = df['bwendu'].str.replace('C','').astype('int32')
df['ywendu'] = df['ywendu'].map(lambda x : int(str(x).replace('C','')))
# 新增一列为月份
df['month'] = df['ymd'].str[:7]

# 定义函数
def getWenduTopN(df,topn):
    """
    :param df:这里的df是每个month分组后的df
    :param topn:
    :return:
    """
    # 首先对按照月份分组后的df进行对温度的升序,然后取ymd,bwendu两列,然后因为升序所以从后往前取topn行
    return df.sort_value(by='bwendu')[['ymd','bwendu']][-topn:]

df.groupby('month').apply(getWenduTopN,topn=2).head()

# 所以groupby的apply函数返回的dataframe,其实和原来的dataframe可以完全不一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值