美文网首页
18 Pandas的数据转换函数map、apply、applym

18 Pandas的数据转换函数map、apply、applym

作者: Viterbi | 来源:发表于2022-11-09 09:45 被阅读0次

    18 Pandas的数据转换函数map、apply、applymap

    数据转换函数对比:map、apply、applymap:

    1. map:只用于Series,实现每个值->值的映射;
    2. apply:用于Series实现每个值的处理,用于Dataframe实现某个轴的Series的处理;
    3. applymap:只能用于DataFrame,用于处理该DataFrame的每个元素;

    1. map用于Series值的转换

    实例:将股票代码英文转换成中文名字

    Series.map(dict) or Series.map(function)均可

    
    import pandas as pd
    stocks = pd.read_excel('./datas/stocks/互联网公司股票.xlsx')
    stocks.head()
    
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    日期 公司 收盘 开盘 交易量 涨跌幅
    0 2019-10-03 BIDU 104.32 102.35 104.73 101.15 2.24 0.02
    1 2019-10-02 BIDU 102.62 100.85 103.24 99.50 2.69 0.01
    2 2019-10-01 BIDU 102.00 102.80 103.26 101.00 1.78 -0.01
    3 2019-10-03 BABA 169.48 166.65 170.18 165.00 10.39 0.02
    4 2019-10-02 BABA 165.77 162.82 166.88 161.90 11.60 0.00
    stocks["公司"].unique()
    
    
        array(['BIDU', 'BABA', 'IQ', 'JD'], dtype=object)
    
    
    # 公司股票代码到中文的映射,注意这里是小写
    dict_company_names = {
        "bidu": "百度",
        "baba": "阿里巴巴",
        "iq": "爱奇艺", 
        "jd": "京东"
    }
    

    方法1:Series.map(dict)

    stocks["公司中文1"] = stocks["公司"].str.lower().map(dict_company_names)
    
    stocks.head()
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    日期 公司 收盘 开盘 交易量 涨跌幅 公司中文1
    0 2019-10-03 BIDU 104.32 102.35 104.73 101.15 2.24 0.02 百度
    1 2019-10-02 BIDU 102.62 100.85 103.24 99.50 2.69 0.01 百度
    2 2019-10-01 BIDU 102.00 102.80 103.26 101.00 1.78 -0.01 百度
    3 2019-10-03 BABA 169.48 166.65 170.18 165.00 10.39 0.02 阿里巴巴
    4 2019-10-02 BABA 165.77 162.82 166.88 161.90 11.60 0.00 阿里巴巴

    方法2:Series.map(function)

    function的参数是Series的每个元素的值

    stocks["公司中文2"] = stocks["公司"].map(lambda x : dict_company_names[x.lower()])
    
    stocks.head()
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    日期 公司 收盘 开盘 交易量 涨跌幅 公司中文1 公司中文2
    0 2019-10-03 BIDU 104.32 102.35 104.73 101.15 2.24 0.02 百度 百度
    1 2019-10-02 BIDU 102.62 100.85 103.24 99.50 2.69 0.01 百度 百度
    2 2019-10-01 BIDU 102.00 102.80 103.26 101.00 1.78 -0.01 百度 百度
    3 2019-10-03 BABA 169.48 166.65 170.18 165.00 10.39 0.02 阿里巴巴 阿里巴巴
    4 2019-10-02 BABA 165.77 162.82 166.88 161.90 11.60 0.00 阿里巴巴 阿里巴巴

    2. apply用于Series和DataFrame的转换

    • Series.apply(function), 函数的参数是每个值
    • DataFrame.apply(function), 函数的参数是Series

    Series.apply(function)

    function的参数是Series的每个值

    stocks["公司中文3"] = stocks["公司"].apply(
    	lambda x : dict_company_names[x.lower()])
    
    stocks.head()
    
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    日期 公司 收盘 开盘 交易量 涨跌幅 公司中文1 公司中文2 公司中文3
    0 2019-10-03 BIDU 104.32 102.35 104.73 101.15 2.24 0.02 百度 百度 百度
    1 2019-10-02 BIDU 102.62 100.85 103.24 99.50 2.69 0.01 百度 百度 百度
    2 2019-10-01 BIDU 102.00 102.80 103.26 101.00 1.78 -0.01 百度 百度 百度
    3 2019-10-03 BABA 169.48 166.65 170.18 165.00 10.39 0.02 阿里巴巴 阿里巴巴 阿里巴巴
    4 2019-10-02 BABA 165.77 162.82 166.88 161.90 11.60 0.00 阿里巴巴 阿里巴巴 阿里巴巴

    DataFrame.apply(function)

    function的参数是对应轴的Series

    stocks["公司中文4"] = stocks.apply(
        lambda x : dict_company_names[x["公司"].lower()], 
        axis=1)
    

    注意这个代码:
    1、apply是在stocks这个DataFrame上调用;
    2、lambda x的x是一个Series,因为指定了axis=1所以Seires的key是列名,可以用x[‘公司’]获取

    
    stocks.head()
    
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    日期 公司 收盘 开盘 交易量 涨跌幅 公司中文1 公司中文2 公司中文3 公司中文4
    0 2019-10-03 BIDU 104.32 102.35 104.73 101.15 2.24 0.02 百度 百度 百度 百度
    1 2019-10-02 BIDU 102.62 100.85 103.24 99.50 2.69 0.01 百度 百度 百度 百度
    2 2019-10-01 BIDU 102.00 102.80 103.26 101.00 1.78 -0.01 百度 百度 百度 百度
    3 2019-10-03 BABA 169.48 166.65 170.18 165.00 10.39 0.02 阿里巴巴 阿里巴巴 阿里巴巴 阿里巴巴
    4 2019-10-02 BABA 165.77 162.82 166.88 161.90 11.60 0.00 阿里巴巴 阿里巴巴 阿里巴巴 阿里巴巴

    3. applymap用于DataFrame所有值的转换

    sub_df = stocks[['收盘', '开盘', '高', '低', '交易量']]
    
    sub_df.head()
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    收盘 开盘 交易量
    0 104.32 102.35 104.73 101.15 2.24
    1 102.62 100.85 103.24 99.50 2.69
    2 102.00 102.80 103.26 101.00 1.78
    3 169.48 166.65 170.18 165.00 10.39
    4 165.77 162.82 166.88 161.90 11.60
    
    # 将这些数字取整数,应用于所有元素
    sub_df.applymap(lambda x : int(x))
    
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    收盘 开盘 交易量
    0 104 102 104 101 2
    1 102 100 103 99 2
    2 102 102 103 101 1
    3 169 166 170 165 10
    4 165 162 166 161 11
    5 165 168 168 163 14
    6 16 15 16 15 10
    7 15 15 15 15 8
    8 15 16 16 15 11
    9 28 28 28 27 8
    10 28 28 28 27 9
    11 28 28 28 27 10
    
    # 直接修改原df的这几列
    stocks.loc[:, ['收盘', '开盘', '高', '低', '交易量']] = sub_df.applymap(lambda x : int(x))
    
    
    stocks.head()
    
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    日期 公司 收盘 开盘 交易量 涨跌幅 公司中文1 公司中文2 公司中文3 公司中文4
    0 2019-10-03 BIDU 104 102 104 101 2 0.02 百度 百度 百度 百度
    1 2019-10-02 BIDU 102 100 103 99 2 0.01 百度 百度 百度 百度
    2 2019-10-01 BIDU 102 102 103 101 1 -0.01 百度 百度 百度 百度
    3 2019-10-03 BABA 169 166 170 165 10 0.02 阿里巴巴 阿里巴巴 阿里巴巴 阿里巴巴
    4 2019-10-02 BABA 165 162 166 161 11 0.00 阿里巴巴 阿里巴巴 阿里巴巴 阿里巴巴

    本文使用 文章同步助手 同步

    相关文章

      网友评论

          本文标题:18 Pandas的数据转换函数map、apply、applym

          本文链接:https://www.haomeiwen.com/subject/kyfftdtx.html