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