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

Pandas中如何对每个分组应用apply函数,第1张

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可以完全不一样

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/715090.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存