传递给apply()方法的对象是系列对象,其索引是DataFrame的索引,轴=0,或DataFrame的列,轴=1。
Pandas 数据框架apply
Pandas DataFrame apply()是一个库函数,允许用户传递一个函数并将其应用于系列的每一个值。
要将一个函数 应用到Pandas DataFrame的每 一行,请使用**Pandas df.apply()**函数。
语法
DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds)
参数
apply()方法有以下参数:
-
func:它是要应用到每一行或每一列的函数。
-
axis:它采取整数值,可以有0和1的值。它的默认值是0,0表示索引,1表示列。它告诉我们函数是沿着哪个轴应用的。
-
原始值:它接受布尔值。它的默认值是False。它决定了行或列是作为Series还是ndarray对象被传递。
-
result_type :它可以有3个值'expand', 'reduce', 'broadcast', 或者被标记为None。这个函数只在我们以列为单位工作时发挥作用,当轴=1时:
- 'expand' = 在这个类似列表的地方,结果将变成列。
- 'reduce' = 如果可能的话,它返回一个系列,而不是扩展列表式的结果。
- 'broadcast' = 在此,结果将被广播到DataFrame的原始形状。在这种情况下,原始索引和列将被保留。默认值是无,这取决于应用函数的返回值。
-
args: 它采用一个元组的形式。除了数组/系列之外,要传递给方法的位置参数。
-
kwds:它是额外的关键字参数,作为关键字参数传递给函数。
返回值
DataFrame apply()方法返回一个系列或DataFrame,它是沿着DataFrame的给定轴线应用函数的结果。
关于pandas.apply()的示例程序
编写一个程序来展示pandas.apply()的工作
import numpy as np
import pandas as pd
df = pd.DataFrame([[1, 4], [9, 16], [25, 36]], columns=['1st', '2nd'])
print(df, '\n')
df2 = df.apply(np.sqrt)
print(df2)
输出
1st 2nd
0 1 4
1 9 16
2 25 36
1st 2nd
0 1.0 2.0
1 3.0 4.0
2 5.0 6.0
在上面的代码中,我们可以看到,我们已经创建了一个名为data1的DataFrame,在其中我们取了不同的值,如1,4,9,16,等等。
之后,我们在apply方法中使用了通用函数np sqrt()来将DataFrame的值减少到插入值的平方根(我们也可以在apply()方法中使用用户定义的函数)。之后,我们打印了DataFrame。
例2
在这个例子中,我们将添加一个名为sum 的新列,将各行的值相加:
import numpy as np
import pandas as pd
df = pd.DataFrame([[1, 4], [9, 16], [25, 36]], columns=['1st', '2nd'])
print(df, '\n')
df['add'] = df.apply(np.sum, axis=1)
print('\nAfter Applying Function: ')
# printing the new dataframe
print(df)
输出结果
1st 2nd
0 1 4
1 9 16
2 25 36
After Applying Function:
1st 2nd add
0 1 4 5
1 9 16 25
2 25 36 61
输出显示,新的列add有特定行的数值之和。
对数据框架中的每一行或每一列应用lambda函数
Python lambda或匿名函数是一种没有名称的方法。在Python中,标准函数是用def关键字定义的,而匿名函数是用lambda关键字定义的。
比方说,我们有一个lambda函数,它接受一个系列作为参数,通过在给定系列的每个值中乘以11来返回新的系列对象。
比如说:
lambda a : a * 11
好的,现在让我们看看如何将lambda函数应用于我们DataFrame的每一行或每一列。
我们可以将lambda a: a * 11函数应用于DataFrame中的每一列,将lambda函数作为DataFrame.apply()的唯一参数与上述创建的DataFrame对象一起传递。
请看下面的代码:
import pandas as pd
matrix = [(11, 21, 19), (22, 42, 38), (33, 63, 57), (44, 84, 76),
(55, 105, 95)]
# Create a DataFrame object
dfObj = pd.DataFrame(matrix, columns=list('xyz'))
print('Before Lambda Function applied')
print(dfObj)
print('------------------')
# modify the dataframe by applying lambda function
modDfObj = dfObj.apply(lambda a: a * 11)
print('After Lambda Function applied')
print(modDfObj)
输出
Before Lambda Function applied
x y z
0 11 21 19
1 22 42 38
2 33 63 57
3 44 84 76
4 55 105 95
------------------
After Lambda Function applied
x y z
0 121 231 209
1 242 462 418
2 363 693 627
3 484 924 836
4 605 1155 1045
将lambda函数应用于每一行
要将lambda函数应用到DataFrame中的每一行,将lambda函数作为DataFrame.apply() 中的第一个也是唯一的参数与上述创建的DataFrame对象一起传递。
此外,我们还必须传递axis = 1作为参数,表示apply() 函数应该被赋予每一行:
import pandas as pd
matrix = [(11, 21, 19), (22, 42, 38), (33, 63, 57), (44, 84, 76),
(55, 105, 95)]
# Create a DataFrame object
dfObj = pd.DataFrame(matrix, columns=list('xyz'))
print('Before Lambda Function applied')
print(dfObj)
print('------------------')
# modify the dataframe by applying lambda function
modDfObj = dfObj.apply(lambda a: a * 11, axis=1)
print('After Lambda Function applied')
print(modDfObj)
输出
Before Lambda Function applied
x y z
0 11 21 19
1 22 42 38
2 33 63 57
3 44 84 76
4 55 105 95
------------------
After Lambda Function applied
x y z
0 121 231 209
1 242 462 418
2 363 693 627
3 484 924 836
4 605 1155 1045
所以,DataFrame.apply()为每一行调用传递的lambda方法,并将每一行的内容作为一个系列给这个lambda函数。
最后,apply()函数返回由lambda函数返回的行构建的DataFrame的修改副本,而不是改变原始DataFrame。
应用一个用户定义的函数
我们将在apply()方法中给出用户定义的函数,而不是传递lambda函数,它将根据用户定义的函数的逻辑返回输出。
import pandas as pd
def sicmundus(x):
return x + 33
matrix = [(11, 21, 19), (22, 42, 38), (33, 63, 57), (44, 84, 76),
(55, 105, 95)]
# Create a DataFrame object
dfObj = pd.DataFrame(matrix, columns=list('xyz'))
print('Before User defined Function applied')
print(dfObj)
print('------------------')
# modify the dataframe by applying user defined function
modDfObj = dfObj.apply(sicmundus)
print('After User defined Function applied')
print(modDfObj)
输出
Before User defined Function applied
x y z
0 11 21 19
1 22 42 38
2 33 63 57
3 44 84 76
4 55 105 95
------------------
After User defined Function applied
x y z
0 44 54 52
1 55 75 71
2 66 96 90
3 77 117 109
4 88 138 128
在这个例子中,我们使用一个用户定义的函数为所有的DataFrame值添加了33。
总结
在这篇文章中,我们讨论了如何将一个给定的lambda函数或用户定义的函数或numpy函数应用到DataFrame的每一行或每一列。
这是针对Pandas DataFrame apply()函数。