Pandas DataFrame的应用完整指南

564 阅读6分钟

传递给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()函数。