Pandas DataFrame DataFrame.apply() 函数

Suraj Joshi 2023年1月30日
  1. pandas.DataFrame.apply() 语法
  2. 示例代码:DataFrame.apply() 方法
  3. 示例代码:用 DataFrame.apply() 将函数应用到每一列
  4. 示例代码:用 DataFrame.apply() 方法将函数应用到每一行
  5. 示例代码:DataFrame.apply() 方法,参数为 result_type
Pandas DataFrame DataFrame.apply() 函数

pandas.DataFrame.apply() 函数将输入函数应用于调用者 Pandas DataFrame 的每一行或每一列元素。

pandas.DataFrame.apply() 语法

DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)

参数

func 要应用于每一行或每一列的函数
axis 沿着行(axis=0)或列(axis=1)来应用函数
raw 布尔类型. 行/列以 Series 对象(raw=False)或 ndarray 对象(raw=True)形式传递的行/列
result_type {expand, reduce, broadcast, None}
操作输出的类型只适用于 axis=1(列)
在 0.23.0 版本中新增
args func 函数的位置参数
**kwds 函数 func 的关键字参数

返回值

它沿着指定的轴应用输入函数后返回 DataFrame

示例代码:DataFrame.apply() 方法

import pandas as pd

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print(df)
modified_df=df.apply(lambda x: x**2)
print(modified_df)

输出:

   X  Y
0  1  4
1  2  1
2  3  8
   X   Y
0  1  16
1  4   1
2  9  64

我们使用 DataFrame.apply() 方法将一个 lambda 函数 lambda x: x**2 应用到 DataFrame 的所有元素。

Lambda 函数是 Python 中比较简单的函数定义方式。

lambda x: x**2 表示将 x 作为输入并返回 x**2 作为输出的函数。

示例代码:用 DataFrame.apply() 将函数应用到每一列

import pandas as pd
import numpy as np

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print("Original DataFrame")
print(df)
modified_df=df.apply(np.sum)
print("Modified DataFrame")
print(modified_df)

输出:

Original DataFrame
   X  Y
0  1  4
1  2  1
2  3  8
Modified DataFrame
X     6
Y    13
dtype: int64

这里,np.sum 被应用到每一列,因为在这种情况下 axis=0(默认值)。

因此,在使用 df.apply() 方法后,我们得到每列中元素的总和。

import pandas as pd
df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print(df)
modified_df=df.apply(lambda x: (x**2)  if x.name == 'X' else x)
print(modified_df)

输出:

   X  Y
0  1  4
1  2  1
2  3  8
   X  Y
0  1  4
1  4  1
2  9  8

如果我们希望只将函数应用于某些列,我们使用 if 语句修改函数定义来过滤列。在本例中,函数只修改了列名为 X 的列的值。

示例代码:用 DataFrame.apply() 方法将函数应用到每一行

import pandas as pd
import numpy as np

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print("Original DataFrame")
print(df)
modified_df=df.apply(np.sum, axis=1)
print("Modified DataFrame")
print(modified_df)

输出:

Original DataFrame
   X  Y
0  1  4
1  2  1
2  3  8
Modified DataFrame
0     5
1     3
2    11
dtype: int64

这里,np.sum 被应用于到每一行,因为我们设置了 axis=1

因此,在使用 df.apply() 方法后,我们得到所有行的单个元素的总和。

import pandas as pd

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print(df)
modified_df=df.apply(lambda x: (x**2)  if x.name in [0,1] else x,
                     axis=1)
print(modified_df)

输出:

   X  Y
0  1  4
1  2  1
2  3  8
   X   Y
0  1  16
1  4   1
2  3   8

如果我们希望只将函数应用于某些行,我们使用 if 语句修改函数定义来过滤行。在这个例子中,函数只修改了索引 01 的行的值,即只修改了第一行和第二行。

示例代码:DataFrame.apply() 方法,参数为 result_type

如果我们使用 result_type 参数的默认值,即 None,它将不加任何修改地返回 DataFrame

import pandas as pd

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print("Original DataFrame")
print(df)

modified_df=df.apply(lambda x:[1,1],axis=1)
print("Modified DataFrame")
print(modified_df)

输出:

Original DataFrame
   X  Y
0  1  4
1  2  1
2  3  8
Modified DataFrame
0    [1, 1]
1    [1, 1]
2    [1, 1]
dtype: object

在上面的例子中,每一行都被传递到函数中,并且行的值被设置为 [1,1]

如果我们想修改函数对 DataFrame 操作后的结果类型,可以根据自己的需要设置 result_type 的值。

import pandas as pd

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print("Original DataFrame")
print(df)

modified_df=df.apply(lambda x:[1,1],
                     axis=1,
                     result_type='expand')
print("Modified DataFrame")
print(modified_df)

输出:

Original DataFrame
   X  Y
0  1  4
1  2  1
2  3  8
Modified DataFrame
   0  1
0  1  1
1  1  1
2  1  1

设置 result_type='expand'将所有列表式的值扩展到 Dataframe 的列中。

作者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

相关文章 - Pandas DataFrame