pandas DataFrame applymap()函数

1.dataframe和series中都有apply方法,dataframe中的apply方法需要指定axis参数,是对一行或者一列进行操作,比如求一列的最大值与最小值之差等;series中的apply方法与map方法一样,都是作用于单个元素,所以不具有axis参数;更不能求最大值与最小值之差,因为apply到的是单个元素,单个元素时没有最大值、最小值一说的;

2. dataframe中的apply()函数是自动作用于每一列/行,不是单独某一列或者某一行,否则就成了series了;

3.series中的map和apply函数自动作用于每一个元素,不是单独的某个元素,否则直接指定元素进行相应操作好啦,不用map和apply函数了

在pandas中, apply() 方法使用是非常灵活的,他比 agg() 方法使用更自由。数据分析师日常使用最多的就是 apply() 方法了,而与之类似的还有 applymap() 和 map() 方法,因此本文将详细介绍下这三种方法的使用和区别:

  • apply:应用在DataFrame的行或列中;

  • applymap:应用在DataFrame的每个元素中;

  • map:应用在单独一列(Series)的每个元素中

1、 apply()方法

前面也说了apply方法是一般性的“拆分-应用-合并”方法。它既可以得到一个经过广播的标量值,也可以得到一个相同大小的结果数组。我们先来看下函数形式:

1

DataFrame.apply(func, axis=0, broadcast=None, raw=False, reduce=None, result_type=None, args=(), **kwds)

最重要的是传入的参数 func , func 可以是已经有的函数(比如: np.mean )或者自定义的函数。假设现有如下数据:

1

2

3

4

5

6

7

8

>>>import numpy as np

>>>import pandas as pd

 

>>>df = pd.DataFrame(np.random.randn(2, 2), columns=list('AB'))

>>>df

          A         B

0  0.109197  0.510993

1  0.888893  0.561702

可以直接使用NumPy的函数:

1

2

3

4

5

6

7

8

9

10

11

# 默认为行运算

>>>df.apply(np.sum)

A    0.998090

B    1.072696

dtype: float64

 

# axis=1列运算

>>>df.apply(np.sum, axis=1)

0    0.620191

1    1.450596

dtype: float64

或者使用 lambda 函数做简单的运算:

1

2

3

4

>>>df.apply(lambda x: x + 1)

          A         B

0  1.109197  1.510993

1  1.888893  1.561702

 

但是这样使用起来非常不方便,每次都要定义 lambda 函数。因此可以通过 def 定义一个函数,然后再调用该函数,在实际处理中都是定义自己所需要的函数完成操作:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

>>>def cal_result(df, x, y):

       df['C'] = (df['A'] + df['B']) * x

       df['D'] = (df['A'] + df['B']) * y

       return df

 

>>>df.apply(cal_result, x=3, y=8, axis=1)            # 第一种方式

          A         B         C          D

0  0.109197  0.510993  1.860572   4.961525

1  0.888893  0.561702  4.351787  11.604764

 

>>>df.apply(cal_result, args=(3, 8), axis=1)         # 第二种方式

          A         B         C          D

0  0.109197  0.510993  1.860572   4.961525

1  0.888893  0.561702  4.351787  11.604764

 

>>>df.apply(cal_result, **{'x': 3, 'y': 8}, axis=1)  # 第三种方式

          A         B         C          D

0  0.109197  0.510993  1.860572   4.961525

1  0.888893  0.561702  4.351787  11.604764

在这里我们先定义了一个 cal_result 函数,它的作用是计算 A,B 列和的 x 倍和 y 倍添加到 C,D 列中。这里有三种方式可以完成参数的赋值,第一种方式直接通过关键字参数赋值,指定参数的值;第二种方式是使用 args 关键字参数传入一个包含参数的元组;第三种方式传入通过 ** 传入包含参数和值的字典。

apply的使用是很灵活的,再举一个例子,配合 loc 方法我们能够在最后一行得到一个总和:

1

2

3

4

5

6

>>>df.loc[2] = df.apply(np.sum)

>>>df

          A         B

0  0.109197  0.510993

1  0.888893  0.561702

2  0.998090  1.072696

 

pandas DataFrame的 applymap() 函数:

          可以对DataFrame里的每个值进行处理,然后返回一个新的DataFrame

 1、 对每一列都加1操作

import pandas as pd

df = pd.DataFrame({
    'a': [1, 2, 3],
    'b': [10, 20, 30],
    'c': [5, 10, 15]
})
    
def add_one(x):
     return x + 1

 输出应用applymap()

print df.applymap(add_one)


   a   b   c
0  2  11   6
1  3  21  11
2  4  31  16

2、 例子说明:

这里有一组数据是10个学生的两次考试成绩,要求把成绩转换成ABCD等级:

转换规则是:

         90-100   ->   A
         80-89     ->   B
         70-79     ->   C
         60-69     ->   D
         0-59       ->   F

 DF对象:

grades_df = pd.DataFrame(
    data={'exam1': [43, 81, 78, 75, 89, 70, 91, 65, 98, 87],
          'exam2': [24, 63, 56, 56, 67, 51, 79, 46, 72, 60]},
    index=['Andre', 'Barry', 'Chris', 'Dan', 'Emilio', 
           'Fred', 'Greta', 'Humbert', 'Ivan', 'James']
)

applymap() 应用, 可以直接写一个函数, 也可以用 lambda 函数

def convert_to_letter(score):
    if (score >= 90):
        return 'A'
    elif (score >= 80):
        return 'B'
    elif (score >= 70):
        return 'C'
    elif (score >= 60):
        return 'D'
    else:
        return 'F'
      
def convert_grades(grades):
    return grades.applymap(convert_to_letter)

print convert_grades(grades_df)

        exam1 exam2
Andre       F     F
Barry       B     D
Chris       C     F
Dan         C     F
Emilio      B     D
Fred        C     F
Greta       A     C
Humbert     D     F
Ivan        A     C
James       B     D

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值