看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 的 applymap() 可以对 DataFrame 逐元素调用函数,对于 Series 的各元素使用 map 函数。如果你的 pandas 是 2.1 及以上的,请停止使用本方法。
!!! danger "弃用预告"
从 pandas 2.1 开始,使用 DataFrame.applymap 时会抛出弃用警告。意味着 applymap 在不久的将来将会不再支持,而会被 DataFrame.map 替代。这样 DataFrame 和 Series 逐元素应用函数将统一使用 map 方法,这将降低我们的学习成本。
applymap 对数据框元素应用函数,此方法应用一个函数,该函数接受并向数据框的每个元素并返回标量。
它与 apply 的区别见下图:
DataFrame 方法的语法如下:
df.applymap(
func: 'PythonFuncType',
na_action: 'str | None' = None,
**kwargs,
) -> 'DataFrame'
参数:
**kwargs
,传给 func 的关键字参数返回:
函数可以支持的类型有:
df.applymap(fun) # 自定义
df.applymap(str) # python 内置函数
df.applymap(lambda x: x*2) # lambda
df.applymap(np.abs) # numpy 等其他库的函数 ufunc
df.applymap(pd.Series.abs) # Pandas 自己的函数
以下是 DataFrame 应用的案例:
df = pd.DataFrame([[1, 2.12], [3.356, 4.567]])
df
'''
0 1
0 1.000 2.120
1 3.356 4.567
'''
df.applymap(lambda x: len(str(x)))
'''
0 1
0 3 4
1 5 5
'''
如同 Series.map, NA 值可以忽略:
df_copy = df.copy()
df_copy.iloc[0, 0] = pd.NA
df_copy.applymap(lambda x: len(str(x)), na_action='ignore')
'''
0 1
0 <NA> 4
1 5 5
'''
请注意,func 的矢量化版本经常存在,这将快得多。你可以把每个数字按元素平方。
df.applymap(lambda x: x**2)
'''
0 1
0 1.000000 4.494400
1 11.262736 20.857489
'''
但在这种情况下最好避免使用 applymap。
df ** 2
'''
0 1
0 1.000000 4.494400
1 11.262736 20.857489
'''
applymap 按元素应用函数,用结果更新 HTML 显示。语法为:
Styler.applymap(
func: 'Callable',
subset: 'Subset | None' = None,
**kwargs,
) -> 'Styler'
参数:
attribute: value; attribute2: value2; …
或者,如果不向该元素应用任何内容,则为空字符串或 None
。**kwargs
:dict,传给 func 的关键字参数返回:
一些使用的案例:
# 定义样式显示函数
def color_negative(v, color):
return f"color: {color};" if v < 0 else None
df = pd.DataFrame(np.random.randn(5, 2), columns=["A", "B"])
# 调用
df.style.applymap(color_negative, color='red')
使用 subset
将函数的应用限制为单列或多列:
# 指定一列
df.style.applymap(color_negative,
color='red',
subset="A")
# 选择两列
df.style.applymap(color_negative,
color='red',
subset=["A", "B"])
使用 subset
的二维筛选功能来选择除列之外的行:
df.style.applymap(color_negative,
color='red',
subset=([0,1,2], slice(None))
df.style.applymap(color_negative,
color='red',
subset=(slice(0,5,2), "A")
apply、map、applymap 对数据类型的支持情况如下:
方法 | DataFrame | Series |
---|---|---|
apply | 支持 | 支持 |
map | - | 支持 |
applymap | 支持 | - |
可以看到,map、applymap 仅支持一种数据类型,apply 全支持。相关方法对比示意图如下:
可以调用 applymap()
的对象还有以下对象,除了上边介绍的外,其他的逻辑类似:
更新时间:2023-09-01 11:22:46 标签:pandas applymap 函数