数据转换函数map,apply,applymap
# 1)map用于Series值的转换 将股票代码英文转换成中文名字
Series.map(dict) or Series.map(function) 都可以
# 公司股票代码到中文的映射,这里都是小写
dict_company_names = {
'bidu':'百度',
'baba':'阿里巴巴',
'iq':'爱奇艺',
}
# 1.1)方案1:Series.map(dict)
stocks['公司中文1'] = stocks['公司'].str.lower().map(dict_company_names)
# 1.2)方案2:Series.map(function) fucntion的参数是Series的每个元素的值
stocks['公司中文2'] = stocks['公司'].map(lambda x:dict_company_names[x.lower()])
# 2)apply用于Series和DataFrame的转换
# Series.apply(function),函数的参数是每个值
# DataFrame.apply(function),函数的参数是Series,fucntion参数是对应轴的Series
# 2.1)方案1
stocks['公司中文3'] = stocks['公司'].apply(
lambda x:dict_company_names[x.lower()]
)
# 2.2)方案2
stocks['公司中文4'] = stocks.apply(
lambda x:dict_company_names[x['公司'].lower()],
axis=1
)
# 注意
# apply是在stock这个DataFrame上调用
# lambda x的x是一个Series,因为指定了axis=1所以Series的key是别名,可以用x['公司']获取
# 3)applymap用于DataFrame所有值的转换
sub_df = stocks[['收盘', '开盘', '高', '低', '交易量']]
# 将这些数字取整数,应用于所有元素
sub_df.applymap(lambda x:int(x))
# 直接修改原df的这几列 将df列中多个内容的值进行修改,赋值给新的值
stocks.loc[:, ['收盘', '开盘', '高', '低', '交易量']] = sub_df.applymap(lambda x:int(x))
分组应用apply函数
# 1)按照用户ID分组,然后对其中一列归一化
def ratings_norm(df): # param df: 每个用户分组的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
ratings = ratings.groupby('UserID').apply(ratings_norm)
ratings[ratings['UserID'] == 1].head()
# 2)怎么提取每个分组的TOP N数据
def getTemperatureTopN(df, topn): # 每个月份分组group的df
return df.sort_values(by='bWendu')[['ymd', 'bWendu']][-topn:]
df.groupby('month').apply(getTemperatureTopN, topn=2).head()
apply给表格添加多列
# 1)Pandas给表格使用apply同时添加多列
import pandas as pd
df = pd.read_csv('data/beijing_tianqi_2018.csv')
df.head()
# ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
# 0 2018-01-01 3度 -6度 晴~多云 东北风 1-2级 59 良 2
# 1 2018-01-02 -3度 6度 阴~多云 东北风 1-2级 49 良 1
# 2 2018-01-03 -6度 -6度 多云 北风 1-2级 28 优 1
df['bWendu'] = df['bWendu'].map(lambda x: str(x).replace('度', '')).astype('int32')
df['yWendu'] = df['yWendu'].map(lambda x: str(x).replace('度', '')).astype('int32')
df.head()
# ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
# 0 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 良 2
# 1 2018-01-02 -3 6 阴~多云 东北风 1-2级 49 良 1
# 2 2018-01-03 -6 -6 多云 北风 1-2级 28 优 1
# 2)添加温差列,平均温度列
def my_func(row):
return row['bWendu'] - row['yWendu'],(row['bWendu'] + row['yWendu'])/2
df[['wencha', 'avg']] = df.apply(my_func, axis=1, result_type='expand')
df.head()
# ymd bWendu yWendu tianqi ... aqiInfo aqiLevel wencha avg
# 0 2018-01-01 3 -6 晴~多云 ... 良 2 9.0 -1.5
# 1 2018-01-02 -3 6 阴~多云 ... 良 1 -9.0 1.5
# 2 2018-01-03 -6 -6 多云 ... 优 1 0.0 -6.0