Pandas_数据转换函数map,apply,applumap

数据转换函数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

posted @ 2022-03-08 16:48  aall_blue  阅读(167)  评论(0)    收藏  举报