美文网首页Python
数据分析—pandas中 map、apply、applymap

数据分析—pandas中 map、apply、applymap

作者: python与数据分析 | 来源:发表于2020-10-13 18:51 被阅读0次

    它们的区别在于应用的对象不同。

    1、map()

    map() 是一个Series的函数,DataFrame结构中没有map()。map()将一个自定义函数应用于Series结构中的每个元素(elements)。

    例子:

    df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],
                       'key2' : ['one', 'two', 'one', 'two', 'one'],
                       'data1' : np.arange(5),
                       'data2' : np.arange(5,10)})
    df
    
    这里写图片描述

    我们现在用map来对列data1改成保留小数点后三位

    #lambda在这里其实是在定义一个简单的函数,一个没有函数名的函数。
    df['data1'] = df['data1'].map(lambda x : "%.3f"%x) 
    df
    
    这里写图片描述

    你也可以用map把key1的a改成c,b改成d

    df['key1'] = df['key1'].map({'a':'c',"b":"d"})
    df
    
    这里写图片描述

    lambda的好处就是简单、好写、好理解。坏处就是不能重复利用,在重复使用时还是要重新再定义。

    2、apply()

    apply()将一个函数作用于DataFrame中的每个行或者列
    axis参数:axis=0 按照列 ;axis=1 按照行

    例子1:

    我们现在用apply来对列data1,data2进行相加

    #axis =1 ,apply function to each row. 
    #axis =0,apply function to each column,default 0
    df['total'] = df[['data1','data2']].apply(lambda x : x.sum(),axis=1 ) 
    df
    
    这里写图片描述
    df.loc['total'] = df[['data1','data2']].apply(lambda x : x.sum(),axis=0 )
    df
    
    这里写图片描述

    例子2: 计算日期相减示例

    平时我们会经常用到日期的计算,比如要计算两个日期的间隔,比如下面的一组关于 wbs 起止日期的数据:

        wbs   date_from     date_to
      job1  2019-04-01  2019-05-01
      job2  2019-04-07  2019-05-17
      job3  2019-05-16  2019-05-31
      job4  2019-05-20  2019-06-11
    

    假定要计算起止日期间隔的天数。比较简单的方法就是两列相减(datetime 类型):

    import pandas as pd
    import datetime as dt
    
    wbs = {
        "wbs": ["job1", "job2", "job3", "job4"],
        "date_from": ["2019-04-01", "2019-04-07", "2019-05-16","2019-05-20"],
        "date_to": ["2019-05-01", "2019-05-17", "2019-05-31", "2019-06-11"]
    }
    
    df = pd.DataFrame(wbs)
    df['elpased'] = df['date_to'].apply(pd.to_datetime) -   
                   df['date_from'].apply(pd.to_datetime)
    

    apply() 函数将 date_from 和 date_to 两列转换成 datetime 类型。我们 print 一下 df:

        wbs   date_from     date_to elapsed
    0  job1  2019-04-01  2019-05-01 30 days
    1  job2  2019-04-07  2019-05-17 40 days
    2  job3  2019-05-16  2019-05-31 15 days
    3  job4  2019-05-20  2019-06-11 22 days
    

    日期间隔已经计算出来,但后面带有一个单位 days,这是因为两个 datetime 类型相减,得到的数据类型是 timedelta64,如果只要数字,还需要使用 timedelta 的 days 属性转换一下。

    elapsed= df['date_to'].apply(pd.to_datetime) -
        df['date_from'].apply(pd.to_datetime)
    df['elapsed'] = elapsed.apply(lambda x : x.days)
    

    使用 DataFrame.apply() 函数也能达到同样的效果,我们需要先定义一个函数 get_interval_days() 函数的第一列是一个 Series 类型的变量,执行的时候,依次接收 DataFrame 的每一行。

    import pandas as pd
    import datetime as dt
    
    def get_interval_days(arrLike, start, end):   
        start_date = dt.datetime.strptime(arrLike[start], '%Y-%m-%d')
        end_date = dt.datetime.strptime(arrLike[end], '%Y-%m-%d') 
    
        return (end_date - start_date).days
    
    
    wbs = {
        "wbs": ["job1", "job2", "job3", "job4"],
        "date_from": ["2019-04-01", "2019-04-07", "2019-05-16","2019-05-20"],
        "date_to": ["2019-05-01", "2019-05-17", "2019-05-31", "2019-06-11"]
    }
    
    df = pd.DataFrame(wbs)
    df['elapsed'] = df.apply(
        get_interval_days, axis=1, args=('date_from', 'date_to'))
    

    3、applymap()

    将函数做用于DataFrame中的所有元素(elements)

    例子:

    例如,在所有元素前面加个字符A

    def  addA(x):
        return "A" + str(x )
    df.applymap(addA)
    
    这里写图片描述

    其实,只要转换一下,三者都是可以通用的,就看你写代码的时候,你的对象写的是那个了,是是一列,一行,还是全部。

    学习链接:https://blog.csdn.net/stone0823/article/details/100008619

    相关文章

      网友评论

        本文标题:数据分析—pandas中 map、apply、applymap

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