DataFrame的自定义函数apply

2020-11-28  本文已影响0人  Chaweys

#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
'''


上一篇下一篇

猜你喜欢

热点阅读