虽然applymap DataFrame 上的函数按元素操作,transform函数似乎实现了同样的事情,除了声称返回一个类似索引的数据帧。
问题:
- 是否存在其中一个有效而另一个无效的用例?
- 其中一个的表现是否优于另一个?
- 文档中描述的 like-indexed DataFrame 是什么?
请您参考如下方法:
不同的用例。比较它们时,同时显示 apply 和 agg 很有用。
设置
np.random.seed([3,1415])
df = pd.DataFrame(np.random.randint(10, size=(6, 4)), columns=list('ABCD'))
df
A B C D
0 0 2 7 3
1 8 7 0 6
2 8 6 0 2
3 0 4 9 7
4 3 2 4 3
5 3 6 7 7
pd.DataFrame.applymap
这需要一个函数并返回一个新的数据帧,该函数的结果应用于每个单元格中的值,并用结果替换单元格的值。
df.applymap(lambda x: str(x) * x)
A B C D
0 22 7777777 333
1 88888888 7777777 666666
2 88888888 666666 22
3 4444 999999999 7777777
4 333 22 4444 333
5 333 666666 7777777 7777777
pd.DataFrame.agg
承担一项或多项职能。每个函数都应该是一个聚合函数。这意味着每个函数都应用于每一列,并且应该返回一个值来替换整列。例如 'mean' 或 'max'。两者都获取一组数据并返回一个标量。
df.agg('mean')
A 3.666667
B 4.500000
C 4.500000
D 4.666667
dtype: float64
或者
df.agg(['mean', 'std', 'first', 'min'])
A B C D
mean 3.666667 4.500000 4.500000 4.666667
std 3.614784 2.167948 3.834058 2.250926
min 0.000000 2.000000 0.000000 2.000000
pd.DataFrame.transform
接受一个预期应用于列的函数并返回大小相等的列。
df.transform(lambda x: x / x.std())
A B C D
0 0.000000 0.922531 1.825742 1.332785
1 2.213133 3.228859 0.000000 2.665570
2 2.213133 2.767594 0.000000 0.888523
3 0.000000 1.845062 2.347382 3.109832
4 0.829925 0.922531 1.043281 1.332785
5 0.829925 2.767594 1.825742 3.109832
pd.DataFrame.apply
pandas 试图弄清楚 apply 是否正在减少它正在操作的列的维数(也称为聚合),或者它是否正在将该列转换为另一个大小相同的列。当它弄清楚后,它会运行剩余的操作,就好像它是一个聚合或转换过程一样。
df.apply('mean')
A 3.666667
B 4.500000
C 4.500000
D 4.666667
dtype: float64
或者
df.apply(lambda x: (x - x.mean()) / x.std())
A B C D
0 -1.014353 -1.153164 0.652051 -0.740436
1 1.198781 1.153164 -1.173691 0.592349
2 1.198781 0.691898 -1.173691 -1.184698
3 -1.014353 -0.230633 1.173691 1.036611
4 -0.184428 -1.153164 -0.130410 -0.740436
5 -0.184428 0.691898 0.652051 1.036611
