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条)