Pandas中lambda函数的应用

在使用pandas的过程中,我们可以结合lambda函数很方便的进行各种数据处理操作。而lambda在pandas就又经常和df.assign、df.apply两个函数组合使用,df.assign经常用于列的修改和新增,apply经常作用于一维向量上,其既可作用于行,也可以作用于列,又可作用于元素。lambda单独使用的示例如下:

lambda:输入是传入到参数列表x的值,输出是根据表达式(expression)计算得到的值。
比如:lambda x, y: xy #函数输入是x和y,输出是它们的积xy
lambda x :x[-2:] #x是字符串时,输出字符串的后两位
lambda x :func #输入 x,通过函数计算后返回结果
lambda x: ‘%.2f’ % x # 对结果保留两位小数

lambda与pandas组合使用,只保留某列字符的最后两位内容的操作如下:

df[‘time’]=df[‘time’].apply(lambda x :x[-2:])

1、使用lambda增加Dataframe一列

df.assign是进行创建修改列操作的函数。

# importing pandas library
import pandas as pd
# creating and initializing a list
values= [['Rohan',455],['Elvish',250],['Deepak',495],
		['Soni',400],['Radhika',350],['Vansh',450]]
# creating a pandas dataframe
df = pd.DataFrame(values,columns=['Name','Total_Marks'])
# Applying lambda function to find
# percentage of 'Total_Marks' column
# using df.assign()
df = df.assign(Percentage = lambda x: (x['Total_Marks'] /500 * 100))
# displaying the data frame
df

2、使用lambda进行多列操作

# importing pandas library
import pandas as pd
# creating and initializing a nested list
values_list = [[15, 2.5, 100], [20, 4.5, 50], [25, 5.2, 80],
			[45, 5.8, 48], [40, 6.3, 70], [41, 6.4, 90],
			[51, 2.3, 111]]
# creating a pandas dataframe
df = pd.DataFrame(values_list, columns=['Field_1', 'Field_2', 'Field_3'])
# Applying lambda function to find
# the product of 3 columns using
# df.assign()
df = df.assign(Product=lambda x: (x['Field_1'] * x['Field_2'] * x['Field_3']))
# printing dataframe
df

pandas-assign-lambda

上面最后一列的结果是前面三列结果的乘积。

3、单行apply操作

通过符合条件的单行进行平方操作。这里使用了lambda和apply函数的结果,axis=1代表对行进行操作,默认是对列进行操作。

# importing pandas and numpy libraries
import pandas as pd
import numpy as np
# creating and initializing a nested list
values_list = [[15, 2.5, 100], [20, 4.5, 50], [25, 5.2, 80],
			[45, 5.8, 48], [40, 6.3, 70], [41, 6.4, 90],
			[51, 2.3, 111]]
# creating a pandas dataframe
df = pd.DataFrame(values_list, columns=['Field_1', 'Field_2', 'Field_3'],
				index=['a', 'b', 'c', 'd', 'e', 'f', 'g'])
# Apply function numpy.square() to square
# the values of one row only i.e. row
# with index name 'd'
df = df.apply(lambda x: np.square(x) if x.name == 'd' else x, axis=1)
# printing dataframe
df

执行结果如下:

	Field_1	Field_2	Field_3
----------------------------------------
a	15.0	2.50	100.0
b	20.0	4.50	50.0
c	25.0	5.20	80.0
d	2025.0	33.64	2304.0
e	40.0	6.30	70.0
f	41.0	6.40	90.0
g	51.0	2.30	111.0

4、lambda多行操作示例

可以通过循环,对多行记录进行操作,具体如下:

# importing pandas and numpylibraries
import pandas as pd
import numpy as np
# creating and initializing a nested list
values_list = [[1.5, 2.5, 10.0], [2.0, 4.5, 5.0], [2.5, 5.2, 8.0],
			[4.5, 5.8, 4.8], [4.0, 6.3, 70], [4.1, 6.4, 9.0],
			[5.1, 2.3, 11.1]]
# creating a pandas dataframe
df = pd.DataFrame(values_list, columns=['Field_1', 'Field_2', 'Field_3'],
				index=['a', 'b', 'c', 'd', 'e', 'f', 'g'])
# Apply function numpy.square() to square
# the values of 2 rows only i.e. with row
# index name 'b' and 'f' only
df = df.apply(lambda x: np.square(x) if x.name in ['b', 'f'] else x, axis=1)
# Applying lambda function to find product of 3 columns
# i.e 'Field_1', 'Field_2' and 'Field_3'
df = df.assign(Product=lambda x: (x['Field_1'] * x['Field_2'] * x['Field_3']))
# printing dataframe
df

执行结果如下:

	Field_1	Field_2	Field_3	Product
-----------------------------------------
a	1.50	2.50	10.0	37.5000
b	4.00	20.25	25.0	2025.0000
c	2.50	5.20	8.0	104.0000
d	4.50	5.80	4.8	125.2800
e	4.00	6.30	70.0	1764.0000
f	16.81	40.96	81.0	55771.5456
g	5.10	2.30	11.1	130.2030

5、同时进行多行多列的操作

这时候可以通过df.apply和df.assign函数同时作用多行和列的值:

# importing pandas and numpylibraries
import pandas as pd
import numpy as np
# creating and initializing a nested list
values_list = [[1.5, 2.5, 10.0], [2.0, 4.5, 5.0], [2.5, 5.2, 8.0],
			[4.5, 5.8, 4.8], [4.0, 6.3, 70], [4.1, 6.4, 9.0],
			[5.1, 2.3, 11.1]]
# creating a pandas dataframe
df = pd.DataFrame(values_list, columns=['Field_1', 'Field_2', 'Field_3'],
				index=['a', 'b', 'c', 'd', 'e', 'f', 'g'])
# Apply function numpy.square() to square
# the values of 2 rows only i.e. with row
# index name 'b' and 'f' only
df = df.apply(lambda x: np.square(x) if x.name in ['b', 'f'] else x, axis=1)
# Applying lambda function to find product of 3 columns
# i.e 'Field_1', 'Field_2' and 'Field_3'
df = df.assign(Product=lambda x: (x['Field_1'] * x['Field_2'] * x['Field_3']))
# printing dataframe
df

执行结果如下:

Field_1	Field_2	Field_3	Product
-------------------------------------------
a	1.50	2.50	10.0	37.5000
b	4.00	20.25	25.0	2025.0000
c	2.50	5.20	8.0	104.0000
d	4.50	5.80	4.8	125.2800
e	4.00	6.30	70.0	1764.0000
f	16.81	40.96	81.0	55771.5456
g	5.10	2.30	11.1	130.2030

6、apply函数操作

最后再列一个通过风速、气温、相对湿度计算人体舒适度指数的示例,如下:

import pandas as pd
import numpy as np
import math
path='D:\\data\\57582.csv'  #文件路径
data=pd.read_csv(path,index_col=0,encoding='gbk')  #读取数据有中文时用gbk解码
#定义舒适指数公式函数,结果保留1位小数
def get_CHB(T,RH,S):
    return round(1.8*T-0.55*(1.8*T-26)*(1-RH/100)-3.2*math.sqrt(S)+32,1)
#增加一列CHB并计算数据后赋值
data['舒适指数']=data.apply(lambda x:get_CHB(x['平均气温'],x['平均相对湿度'],x['2M风速']),axis=1)
#打印结果
print(data)
#保存结果
data.to_csv('D:\\CHB.csv',encoding='gbk')

代码中使用了apply和lambda的组合,传入的参数x为整个data数据,在函数中引入的参数则是x[‘平均气温’],x[‘平均相对湿度’],x[‘2M风速’],与自定义的函数get_CHB对应。最后需使用axis=1来指定是对列进行运算。计算结果是:

发表评论

您的电子邮箱地址不会被公开。