DataFrame(5):自定义函数

如果想要应用自定义的函数,或者把其他库中的函数应用到 Pandas 对象中,有以下三种方法:

  • 1) 操作整个 DataFrame 的函数:pipe()
  • 2) 操作行或者列的函数:apply()
  • 3) 操作单一元素的函数:applymap()


如何从上述函数中选择适合的函数,这取决于函数的操作对象。下面介绍了三种方法的使用。

操作整个数据表

通过给 pipe() 函数传递一个自定义函数和适当数量的参数值,从而操作 DataFrme 中的所有元素。下面示例,实现了数据表中的元素值依次加 3。

首先自定义一个函数,计算两个元素的加和,如下所示:

def adder(ele1,ele2):
    return ele1+ele2

 

然后使用自定义的函数对 DataFrame 进行操作:

df = pd.DataFrame(np.random.randn(4,3,columns=['c1','c2','c3'])
#传入自定义函数以及要相加的数值3
df.pipe(adder,3)

完整的程序,如下所示:

import pandas as pd
import numpy as np
#自定义函数
def adder(ele1,ele2):
    return ele1+ele2
#操作DataFrame
df = pd.DataFrame(np.random.randn(4,3),columns=['c1','c2','c3'])
#相加前
print(df)
#相加后
print(df.pipe(adder,3))

 

输出结果:

       c1        c2        c3
0 -0.584164  0.818250  1.590437
1 -0.258288  0.447029  1.938420
2 -0.390319 -0.580696  1.948987
3 -1.862551 -0.568357  0.979224
         c1        c2        c3
0  2.415836  3.818250  4.590437
1  2.741712  3.447029  4.938420
2  2.609681  2.419304  4.948987
3  1.137449  2.431643  3.979224

操作行或列

如果要操作  DataFrame 的某一行或者某一列,可以使用 apply() 方法,该方法与描述性统计方法类似,都有可选参数 axis,并且默认按列操作。示例如下:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
df.apply(np.mean)
#默认按列操作,计算每一列均值
print(df.apply(np.mean))

输出结果:

col1   -0.437947
col2   -0.616736
col3    0.031630
dtype: float64

传递轴参 axis=1, 表示逐行进行操作,示例如下:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
print(df)
print (df.apply(np.mean,axis=1))

 

输出结果:

      col1      col2      col3
0 -0.978815 -1.963001 -0.478531
1  1.082236  1.103087  0.689981
2  0.321379 -0.600465 -0.169709
3 -1.394568 -0.213248  1.284493
4  0.585636 -0.568272 -0.043831
0   -1.140116
1    0.958435
2   -0.149599
3   -0.107774
4   -0.008822
dtype: float64

求每一列中,最大值与最小值之差。示例如下:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
print(df.apply(lambda x: x.max() - x.min()))

 

输出结果:

col1    1.943701
col2    2.408108
col3    1.576472
dtype: float64

操作单一元素

DataFrame 数据表结构的 applymap() 和 Series 系列结构的 map() 类似,它们都可以接受一个 Python 函数,并返回相应的值。

示例如下:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
#自定义函数lambda函数
print(df['col1'].map(lambda x:x*100))

 

输出结果:

0    -18.171706
1      1.582861
2     22.398156
3     32.395690
4   -133.143543
Name: col1, dtype: float64

下面示例使用了 applymap() 函数,如下所示:

import pandas as pd
import numpy as np
#自定义函数
df = pd.DataFrame(np.random.randn(5,3),columns=['col1','col2','col3'])
print(df.applymap(lambda x:x*10))
print(df.apply(np.mean))

输出结果:

        col1       col2       col3
0  -1.055926   7.952690  15.225932
1   9.362457 -12.230732   7.663450
2   2.910049  -2.782934   2.073905
3 -12.008132  -1.444989   5.988144
4   2.877850   6.563894   8.192513
#求均值:
col1    0.041726
col2   -0.038841
col3    0.782879
dtype: float64
上一篇:pandas获取dataframe中的最后一列数据、dataframe索引最后一列数据(selecting last column of pandas dataframe)


下一篇:年前用Python,选出好基金,稳赚一笔