[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

[Pandas] apply()_第1张图片

res1

[Pandas] apply()_第2张图片

res2

[Pandas] apply()_第3张图片

res3

[Pandas] apply()_第4张图片

# 总结: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)

你可能感兴趣的:(Pandas,python,pandas,数据分析)