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) 而不是使用循环操作,从而达到提高效率的目的。