Pandas知识点-详解转换函数transform

Pandas知识点-详解转换函数transform

transform()是pandas中的转换函数,对DataFrame执行传入的函数后返回一个相同形状的DataFrame。用于对DataFrame中的数据进行转换,本文将对transform()函数进行详细介绍。

transform()参数和用法介绍

transform(func, axis=0, args, *kwargs):

  • func: 用于转换数据的函数,函数必须满足传入一个DataFrame能正常使用,或传递到DataFrame.apply()中能正常使用。
    func可以接收函数的名字、函数名的字符串、函数组成的列表、行/列标签和函数名组成的字典。
  • axis: 设置按列还是按行转换。设置为0或index,表示对每列应用转换函数,设置为1或columns,表示对每行应用转换函数。
  • args: 传递给函数func的位置参数。
  • kwargs: 传递给函数func的关键字参数。

返回数据:

  • 返回的结果是一个与自身形状相同的DataFrame。

transform()传入单个函数


import pandas as pd
import numpy as np

df = pd.DataFrame({'Col-1': [1, 3, 5], 'Col-2': [5, 7, 9]})
print(df)
res1 = df.transform(np.square)
print(res1)
res2 = df.transform('sqrt')
print(res2)
res3 = df.transform(lambda x: x*10)
print(res3)
   Col-1  Col-2
0      1      5
1      3      7
2      5      9
   Col-1  Col-2
0      1     25
1      9     49
2     25     81
      Col-1     Col-2
0  1.000000  2.236068
1  1.732051  2.645751
2  2.236068  3.000000
   Col-1  Col-2
0     10     50
1     30     70
2     50     90

在transform()中传入单个函数进行转换,transform()的结果与apply()/applymap()等效。

函数可以是库函数、自定义函数或匿名函数。因为transform()的返回结果与自身形状相同,所以不支持直接传入会将DataFrame”降维”的函数,如会将Series处理成标量的聚合函数min,mean,std等。传入这些函数时,会报错:ValueError: Function did not transform.

虽然transform()是按行/列来处理数据,但它对数据的处理有点像元素级的处理。上面这种传入单个函数对DataFrame做行列级处理的情况,更推荐使用apply()。

res4 = np.square(df)
print(res4)
   Col-1  Col-2
0      1     25
1      9     49
2     25     81

对于传入单个函数的情况,直接用函数对DataFrame处理结果也一样。

transform()传入多个函数

res5 = df.transform([np.square, np.sqrt])
print(res5)

res6 = df.transform([np.abs, lambda x: x+10, lambda x:np.square(x)])
print(res6)
   Col-1            Col-2
  square      sqrt square      sqrt
0      1  1.000000     25  2.236068
1      9  1.732051     49  2.645751
2     25  2.236068     81  3.000000
     Col-1             Col-2
  absolute  absolute
0        1        1        5       25
1        3        9        7       49
2        5       25        9       81

在transform()中传入多个函数对DataFrame进行转换,结果中的索引变成多层索引,第一层索引是DataFrame的列名,第二层索引是执行的函数名。按第一层索引来比较,DataFrame的形状并没有变化。

在传入多个函数时,传入的方式是用列表传入,此时如果有多个名字相同的函数,只有最后一个函数生效。(聚合函数agg()中多个匿名函数可以同时生效)

按字典的方式传入函数

res7 = df.transform({'Col-1': np.square, 'Col-2': np.sqrt})
print(res7)
res8 = df.transform({'Col-1': [np.square, lambda x: x*10], 'Col-2': np.sqrt})
print(res8)
   Col-1     Col-2
0      1  2.236068
1      9  2.645751
2     25  3.000000
   Col-1              Col-2
  square       sqrt
0      1       10  2.236068
1      9       30  2.645751
2     25       50  3.000000

在transform()中可以用字典的方式给不同的列传入不同的函数,如果字典中的value有列表,则结果的索引变成多层索引。

transform()对Series进行转换

s = pd.Series(range(3))
print(s)
res9 = s.transform(lambda x: x+10)
print(res9)
print(res9.shape)
print('-' * 20)
res10 = s.transform([np.square, lambda x: x*x])
print(res10)
print(res10.shape)
print(type(res10))
0    0
1    1
2    2
dtype: int64
0    10
1    11
2    12
dtype: int64
(3,)
0    230
1    230
2    230
3    330
4    330
5    330
6    330
7    240
8    240
9    240
Name: 成绩, dtype: int64
      姓名   课程  成绩 评级       平均成绩
0    Tom   高数  60  C  73.333333
1    Tom   英语  90  A  86.666667
2    Tom   体育  80  B  76.666667
3   Andy   高数  90  A  73.333333
4   Andy   英语  80  B  86.666667
5   Andy   体育  70  C  76.666667
6   Andy  计算机  90  A  90.000000
7  Kitty   高数  70  C  73.333333
8  Kitty   英语  90  A  86.666667
9  Kitty   体育  80  B  76.666667
    index      姓名   课程    成绩   评级
0       0     Tom   高数  60.0    C
1       1     Tom   英语  90.0    A
2       2     Tom   体育  80.0    B
3       3    Andy   高数  90.0    A
4       4    Andy   英语  80.0    B
5       5    Andy   体育  70.0    C
6       6    Andy  计算机  90.0    A
7       7   Kitty   高数  70.0    C
8       8   Kitty   英语  90.0    A
9       9   Kitty   体育  80.0    B
10      0  Truman   高数   NaN  NaN
11      1  Truman   英语   NaN  NaN
12      2  Truman   体育   NaN  NaN
score_df['成绩'] = score_df.groupby('课程')['成绩'].transform(lambda x: x.fillna(x.mean()))
print('-'*30, '\n', score_df, sep='')

`txt

Original: https://blog.csdn.net/weixin_43790276/article/details/126911525
Author: 小斌哥ge
Title: Pandas知识点-详解转换函数transform

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/750827/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球