Skip to main content
 首页 » 编程设计

python之pandas DataFrame 的 transform 与 applymap 之间有什么区别

2025年05月04日23TianFang

虽然applymap DataFrame 上的函数按元素操作,transform函数似乎实现了同样的事情,除了声称返回一个类似索引的数据帧。

问题:

  1. 是否存在其中一个有效而另一个无效的用例?
  2. 其中一个的表现是否优于另一个?
  3. 文档中描述的 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