[Pandas] apply()

应用在DataFrame的行或列中,默认为列

apply()可以对DataFrame按行和列(默认)进行函数处理,也支持Series。如果是Series,逐个传入具体值,DataFrame逐行或逐列传入

import pandas as pd

df = pd.DataFrame([['liver','E',89,21,24,64],
                   ['Arry','C',36,37,37,57],
                   ['Ack','A',57,60,18,84],
                   ['Eorge','C',93,96,71,78],
                   ['Oah','D',65,49,61,86]
                  ], 
                   columns = ['name','team','Q1','Q2','Q3','Q4'])

# 将name列中的文本全部转换成小写
res1 = df.name.apply(lambda x:x.lower())

# 去掉一个最高分和一个最低分再算出平均分
def my_mean(s):
    max_min_ser = pd.Series([-s.max(), -s.min()])
    return s.append(max_min_ser).sum() / (s.count() - 2)

# 对数字列应用函数
res2 = df.select_dtypes(include = 'number').apply(my_mean)

# 同样的算法以学生为维度计算(计算每个学生的平均成绩)
# 在apply函数中传入axis = 1则每行的数据组成一个Series传入自定义函数中
# 设定name为索引
# 横向计算
res3 = df.set_index('name').select_dtypes(include = 'number').apply(my_mean, axis = 1) 

结果展示

df

res1

res2

res3

# 总结:apply()可以应用的函数类型如下:
df.apply(fun) # 自定义
df.apply(max) # Python内置函数
df.apply(lambda x:x*2) # lambda
df.apply(np.mean) # NumPy等其他库的函数
df.apply(pd.Series.first_valid_index) # Pandas自己的函数

扩展 

1.以下是一个判断一列数据是否包含在另一列数据中的案例

# 判断一个值是否在另一个类似列表的列中
df.apply(lambda d: d.s in d.s_list, axis = 1) # 布尔序列
df.apply(lambda d: d.s in d.s_list, axis = 1).astype(int) # 0和1序列

2.它常被用来与NumPy库中的np.where()方法配合使用,如下例子:

# 函数,将大于90分数标记为good
fun = lambda x: np.where(x.team == 'A' and x.Q1>90,'good','other')
df.apply(fun,axis = 1)

# 效果同上
df.apply(lambda x:x.team == 'A' and x.Q1 > 90, axis = 1).map({True:'good', False:'other'})
df.apply(lambda x:'good' if x.team == 'A' and x.Q1 > 90 else '', axis = 1)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值