我们想在 DataFrame 的每行或者每列上都执行某个函数,可以使用 DataFrame 的 apply 方法。
例如,我们想计算下面 DataFrame 每列的最大值最小值之差:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),
index=['Baidi', 'Wuyi', 'Changan', 'Changshan'])
print(df)
"""
b d e
Baidi 1.671894 0.902370 0.008920
Wuyi -0.368150 0.265574 1.538348
Changan -0.491342 -0.073567 0.257416
Changshan 1.703614 1.007506 -1.837523
"""
f = lambda x: x.max() - x.min()
df.apply(f)
"""
b 2.194956
d 1.081073
e 3.375870
dtype: float64
"""
结果会返回一个 Series,其 index 为 df 的 column。
apply 有 axis 参数,默认为 0,即对每列做运算,如果将其指定为 1 或者 ‘columns’,则会对每行做运算:
df.apply(f, axis='columns')
"""
Baidi 1.662974
Wuyi 1.906497
Changan 0.748758
Changshan 3.541137
dtype: float64
"""
传入 apply 的函数不是必须返回标量值的,也可以返回类似 Series 这样的对象:
def f(x):
return pd.Series([x.min(), x.max()], index=['min', 'max'])
df.apply(f)
"""
b d e
min -0.491342 -0.073567 -1.837523
max 1.703614 1.007506 1.538348
"""
大多数常见的统计方法(例如 sum 和 mean)都是 DataFrame 的方法,因此除非我们需要做一些特别的运算,否则并不需要使用 apply 方法。
Series 也有 apply 方法,用法大致相同,且没有axis 参数。
如果我们想对 DataFrame 中的每个元素都运行我们自己定义的函数,可以使用 applymap 方法。例如:
format = lambda x: '%.2f' % x
df.applymap(format)
"""
b d e
Baidi 1.67 0.90 0.01
Wuyi -0.37 0.27 1.54
Changan -0.49 -0.07 0.26
Changshan 1.70 1.01 -1.84
"""
Series 中对应 applymap 的方法为 map:
df['e'].map(format)
"""
Baidi 0.01
Wuyi 1.54
Changan 0.26
Changshan -1.84
Name: e, dtype: object
"""
Python for Data Analysis, 2 n d ^{\rm nd} nd edition. Wes McKinney.