pandas map(),apply(),applymap()区别解析

1. Pandas中map()、apply()和applymap()函数的基本介绍

Pandas是一个Python数据分析库,它强大的数据处理功能和易于使用的语法,使得 Pandas 成为数据分析和处理领域的最佳工具之一。在 Pandas 的操作中,函数具有很大的灵活性。在这些函数中,有三个函数是非常相似的,但是在使用过程中,它们会有显著的区别。这三个函数分别是:map()、apply() 和 applymap()。这三个函数的作用都是对 Pandas 数据帧中的数据进行计算或操作,它们在使用场景和具体实现方面有所不同。

map():map() 函数是用于序列(如列表、元组或 Dataframe 列)中元素级别转换的函数。它接受一个参数,这个参数可以是一个函数或是字典(也可以是一个序列,但是序列只能用于 Series 类型的数据中)。它的作用是对序列中的每个元素都进行相同的操作并返回新的序列。

apply():apply() 函数是用于 DataFrame 数据结构中元素级别转换的函数。它接受一个 Python 函数并将其应用于一行或一列中的每个元素。它还可用于元素级别函数对 Pandas 数据结构执行更高级的数据操作、函数构建和数据聚合。

applymap():applymap() 函数是用于 DataFrame 数据结构中元素级别转换的函数。它是一个与 apply() 函数类似的函数,但 applymap() 函数将函数应用于数据帧中的每个元素,而不是单独的一行或一列。applymap() 函数只适用于数据帧,不适用于 Pandas Series、列表和元组。

2. map()函数详解

map() 函数是用于 Pandas Series 中元素级别转换的函数。

当需要对一个列表、元组或者 Pandas 列对象的数值进行修改时,可以利用 map() 函数。

map() 函数的用法如下:

s_obj.map(func, na_action=None)

其中,func 可以是一个函数或是字典。当 func 为函数时,map() 函数对 Series 中的每个元素调用此函数,从而对元素进行操作并返回处理结果。

注意:当对较大的数据框进行操作时,直接使用 map() 函数可能会比较慢。因为 map() 函数只适用于 Pandas Series 类型,而且在实现的时候使用了纯 Python 的实现方式(即循环实现),因此效率较低。

下面来看一个示例说明:

import pandas as pd

df = pd.DataFrame({'A': ['cat', 'dog', 'cat', 'dog', 'cat', 'dog', 'cat', 'dog'],

'B': ['fish', 'bird', 'bird', 'fish', 'bird', 'fish', 'fish', 'bird'],

'C': [38, 45, 12, 25, 11, 77, 13, 82]})

# 使用map函数

df['B_new'] = df['B'].map(lambda x : 'FISH' if x == 'fish' else x)

print(df)

输出结果如下:

     A     B   C B_new

0 cat fish 38 FISH

1 dog bird 45 bird

2 cat bird 12 bird

3 dog fish 25 FISH

4 cat bird 11 bird

5 dog fish 77 FISH

6 cat fish 13 FISH

7 dog bird 82 bird

在上述代码中,map 函数用来将 B 列的小写字母修改为大写字母。lambda 函数首先检查是否为 fish,如果是 fish 则返回大写的 FISH;反之则返回元素本身。

2.1 map()函数的函数用法

import pandas as pd

# 定义一个函数,用于将 temperatures 转化成华氏度(Fahrenheits)

def to_fahrenheits(temp):

return (temp * 1.8) + 32

temp_df = pd.DataFrame({'city': ['Paris', 'London', 'New York', 'Tokyo', 'Beijing', 'Rio de Janeiro'],

'temperature': [17, 20, 23, 18, 14, 28]})

# 使用map函数对temperature列进行转换

temp_df['temperature_F'] = temp_df['temperature'].map(to_fahrenheits)

print(temp_df)

运行以上代码,可以得到输出结果如下:

             city  temperature  temperature_F

0 Paris 17 62.60

1 London 20 68.00

2 New York 23 73.40

3 Tokyo 18 64.40

4 Beijing 14 57.20

5 Rio de Janeiro 28 82.40

在上述代码中,我们定义了一个函数 to_fahrenheits(),该函数接受温度值(Celsius)作为参数,并返回相应的温度值(Fahrenheits)。然后,我们使用 map() 函数对 temperature 列执行 to_fahrenheits() 函数,以转换温度值。

3. apply()函数详解

apply() 函数是一种更通用的函数,它可以作用于整个 DataFrame 或 Series 对象上。这里的用法比 map() 函数要灵活得多,常常用于执行通用的数学函数、字符串函数或用户定义的函数等。

apply() 函数的用法如下:

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

和 map() 函数不同,apply() 函数可以接受一些参数,这使得它更加灵活,适用于更多的应用场景。这些参数包括:

func:对DataFrame中每个元素执行的函数。

axis:0或1代表对行或列计算。默认为0。

broadcast:指示是否可以广播。默认为None。

raw:如果是True,则不会转换自定义函数返回的nan值(即数据原样返回)。默认为False。

reduce:在使用apply函数时,可以设置参数reduce为False,这样的话,最终结果序列的维度和输入序列的维度相同。默认为True。

result_type:指定输出结果类型。默认为None。

args:传递给函数的参数元组。

**kwds:传递给函数的关键字参数。

下面来看一个示例说明:

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [2, 3, 4, 5, 6], 'C': [5, 4, 3, 2, 1]})

# 定义一个函数,对每个元素执行次方操作,并求和

def func(x):

return sum(x ** 2)

# 对每一列执行函数操作

df_result = df.apply(func)

print(df_result)

运行以上代码,可以得到输出结果如下:

A    55

B 74

C 55

dtype: int64

在上述代码中,我们定义了一个函数 func(x),对每个元素执行平方操作,然后将所有结果求和。接着,我们使用 apply() 函数对数据框中的每一列执行函数操作,以求出每一列平方和。

3.1 apply()函数的匿名函数用法

除了使用函数之外,您还可以使用 Lambda 函数来传递到 apply() 函数中。

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [2, 3, 4, 5, 6], 'C': [5, 4, 3, 2, 1]})

# 使用匿名函数

df_result = df.apply(lambda x: sum(x ** 2))

print(df_result)

运行以上代码,可以得到输出结果如下:

A    55

B 74

C 55

dtype: int64

在上述代码中,我们使用 Lambda 函数替代了 func() 函数。Lambda 函数仅仅是一个匿名函数,将它作为一个参数传递到 apply() 函数中即可。

4. applymap()函数详解

applymap() 函数是用于像 apply() 函数一样用于 DataFrame 数据结构中元素级别转换的函数。但是不同的是,applymap() 函数是用于按元素遍历 DataFrame 并操作每个元素的函数。

applymap() 函数的用法如下:

df.applymap(func)

其中,func 是要应用于每个 DataFrame 元素的Python函数。

下面来看一个示例说明:

import pandas as pd

df = pd.DataFrame({'A': [1.656708, 2.37871, 3.656708, 4.92387, 5.717],

'B': [2.37871, 3.656708, 4.92387, 5.717, 6.54657],

'C': [5.717, 4.92387, 3.656708, 2.37871, 1.656708]})

# 使用applymap函数

df_result = df.applymap(lambda x: round(x, 2))

print(df_result)

运行以上代码,可以得到输出结果如下:

      A     B     C

0 1.66 2.38 5.72

1 2.38 3.66 4.92

2 3.66 4.92 3.66

3 4.92 5.72 2.38

4 5.72 6.55 1.66

在上述代码中,我们使用了 applymap() 函数将数据框中的所有值都保留两位小数。

5. 小结

以上就是 Pandas 中 map()、apply() 和 applymap() 的全部内容了。这三个函数是 Pandas 常用的操作函数,在实现上均使用了纯 Python 的实现方式,故效率可能会受到一定的影响。当在处理大型数据集时,尽量使用矢量操作 (vectorization) 而不是使用循环操作,从而达到提高效率的目的。

后端开发标签