美文网首页
DataFrame的自定义函数apply

DataFrame的自定义函数apply

作者: Chaweys | 来源:发表于2020-11-28 15:38 被阅读0次

    #coding=utf-8
    import pandas as pd
    import numpy as np
    
    df=pd.read_csv('apply.csv')
    print(df)
    '''
      name     nation  score   date_from     date_to
    0   张宇     汉族    600  2019-04-01  2019-04-10
    1   陈林     汉族    650  2019-05-20  2019-05-31
    2   刘冬     回族    560  2019-05-01  2019-05-02
    '''
    
    #举例1,对score列进行开根号
    print(df.score.apply(np.sqrt))
    '''
    0    24.494897
    1    25.495098
    2    23.664319
    Name: score, dtype: float64
    '''
    
    #举例2,如果名族不是汉族,对score加上10分
    print(df.nation.apply(lambda x:0 if x=='汉族' else 10))
    '''
    1、首先定义一个series,不是汉族为10,是汉族为0
    0    0
    1    0
    2    1
    Name: nation, dtype: int64
    '''
    #将此新的series赋值给df的一个新列
    df['other_score']=df.nation.apply(lambda x:0 if x=='汉族' else 10)
    print(df)
    '''
        name    nation  score   date_from     date_to        other_score
    0   张宇     汉族    600     2019-04-01    2019-04-10            0
    1   陈林     汉族    650     2019-05-20    2019-05-31            0
    2   刘冬     回族    560     2019-05-01    2019-05-02           10
    '''
    #最后定义相加得和之后的新列
    df['total_score']=df.score+df.other_score
    print(df)
    '''
        name    nation  score   date_from     date_to      other_score   total_score
    0   张宇     汉族    600    2019-04-01    2019-04-10            0          600
    1   陈林     汉族    650    2019-05-20    2019-05-31            0          650
    2   刘冬     回族    560    2019-05-01    2019-05-02           10          570
    '''
    
    
    
    
    #举例2、对时间类型的列计算时间间隔,applt(pd.to_datetime)
    #先计算时间间隔的的值返回一个Series
    print(df.date_to.apply(pd.to_datetime) - df.date_from.apply(pd.to_datetime))
    '''
    0    9 days
    1   11 days
    2    1 days
    dtype: timedelta64[ns]
    '''
    #将此Series赋值给一个新列
    df['interval']=df.date_to.apply(pd.to_datetime) - df.date_from.apply(pd.to_datetime)
    print(df)
    '''
        name    nation  score   date_from     date_to       other_score  total_score   interval
    0   张宇     汉族    600     2019-04-01    2019-04-10            0          600      9 days
    1   陈林     汉族    650     2019-05-20    2019-05-31            0          650     11 days
    2   刘冬     回族    560     2019-05-01    2019-05-02           10          570      1 days
    '''
    #去除新列的days,只保留数值
    df['interval']=df.interval.apply(lambda x:x.days)
    print(df)
    '''
        name    nation  score   date_from     date_to       other_score  total_score   interval
    0   张宇     汉族    600     2019-04-01    2019-04-10            0          600       9 
    1   陈林     汉族    650     2019-05-20    2019-05-31            0          650       11 
    2   刘冬     回族    560     2019-05-01    2019-05-02           10          570       1 
    '''
    
    
    
    
    #举例3、判断score>600且interval<=15 ,打个标签1,否则为0
    #注:涉及多列的时候,建议采用自定义函数的方式,且apply(axis=1)需要传入axis=1,否则调用apply报错
    #注:因为涉及多列,所以直接DataFrame的对象df。apply()方式调用,不用指定某列调用apply()
    def f(x):
        if x.score>=600 and x.interval<=51:
            return 1
        else:
            return 0
    print(df.apply(lambda x:f(x),axis=1))
    '''
    apply未传入asix=1
    AttributeError: ("'Series' object has no attribute 'score'", 'occurred at index name')
    
    0    1
    1    1
    2    0
    dtype: int64
    '''
    
    df['label']=df.apply(lambda x:f(x),axis=1)
    print(df)
    '''
        name    nation  score   date_from     date_to       other_score  total_score   interval  label
    0   张宇     汉族    600     2019-04-01    2019-04-10            0          600       9       1 
    1   陈林     汉族    650     2019-05-20    2019-05-31            0          650       11      1
    2   刘冬     回族    560     2019-05-01    2019-05-02           10          570       1       0
    '''
    
    
    

    相关文章

      网友评论

          本文标题:DataFrame的自定义函数apply

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