Pandas数据分析11——pandas数据的函数应用

 参考书目:《深入浅出Pandas:利用Python进行数据处理与分析》


pandas的数据可以使用函数便捷方法去操作

先读取案例数据

import numpy as np
import pandas as pd 
data = 'https://www.gairuo.com/file/data/dataset/team.xlsx'
df = pd.read_excel(data) 

pipe()

# 对 df 多重应用多个函数
f(g(h(df), arg1=a), arg2=b, arg3=c)
# 用 pipe 可以把它们连接起来
(df.pipe(h)
   .pipe(g, arg1=a)
   .pipe(f, arg2=b, arg3=c)
)
# 以下是将 'arg2' 参数给函数 f 然后作为函数整体授受后边的参数
(df.pipe(h)
   .pipe(g, arg1=a)
   .pipe((f, 'arg2'), arg1=a, arg3=c) )

案例

# 定义一个函数,给所有Q的成绩加 n,然后增加平均数 列
# 其中 n 中要加的值,为必传参数
def add_mean(rdf, n):
    df = rdf.copy()
    df = df.loc[:,'Q1':'Q4'].applymap(lambda x: x+n)
    df['avg'] = df.loc[:,'Q1':'Q4'].mean(1)
    return df
# 调用
df.pipe(add_mean, 100)
# 其中 xy 是变量,df_ 是前边的数据内容
#筛选Q1大于80且Q2小于等于90 的数据
df.pipe(lambda df_, x, y: df_[(df_.Q1 >= x) & (df_.Q2 <= y)], 80, 90)

apply()

df.name.apply(lambda x:x.lower())#变小写
df.apply(max) # 所有列的最大值
df.apply(lambda x: x*2) # 所有列的值乘于2 = df * 2
df.Q1.apply(lambda x: x+10 if type(x) is int else x) # 所有数字加10
df.loc[:,'Q1':'Q4'].apply(sum, axis=1) # 指定列横向相加
df.apply(pd.Series.first_valid_index) #pandas的函数
df.apply([sum, 'count']) # 相当于 .aggregate, 即.agg
df.apply({'Q1':sum, 'Q2':'count'}) # 同上

def mymax(x):
    return x.max()
df.apply(lambda x:mymax(x)) # 应用函数

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

案例

#去掉一个最高分和最低分求不同Q的均值
def my_mean(s):
    max_min_ser=pd.Series([-s.max(),-s.min()])
    return s.append(max_min_ser).sum()/(s.count()-2)
df.select_dtypes(include='number').apply(my_mean)
#去掉一个最高分和最低分求学生的平均成绩
df.set_index('name').select_dtypes(include='number').apply(my_mean,axis=1)

#一个常用的根据条件输出结果的案例(使用 numpy 库 np.where):
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 'other', axis=1)

applymap()

df.applymap(lambda x: x*2) # 所有元素的最大值
df.applymap(lambda x: len(str(x))) # 所有的值长度
df.applymap(lambda x: x+10 if type(x) is int else x) # 所有数字加10

def mylen(x):
    return len(str(x))
df.applymap(mylen) # 应用函数
# 对空值不使用函数 pandas 1.2.0+
df.applymap(mylen, na_action='ignore')

map()

#根据输入对应关系映射值修改内容,用于 Series 对象或 DataFrame 对象的一列。
df.team.map({'A':'一班', 'B':'二班','C':'三班', 'D':'四班',}) # 枚举替换
df.team.map('I am a {}'.format)
df.team.map('I am a {}'.format, na_action='ignore')
t = pd.Series({'six': 6., 'seven': 7.})
s.map(t)
# 应用函数
def f(x):
    return len(str(x))
# 调用
df['name'].map(f)

# 三种情况的判断
fun = lambda x: (x>60 and '及格') or (x==60 and '60分') or (x<60 and '不及格')
df.Q1.map(fun)
# 利用 np.sign 判断值为正、负、0的情况,并映射文案
label = {0: '平', 1:'涨', -1:'跌'}
ser.map(np.sign).map(label)

agg()

#使用指定轴上的一项或多项操作进行汇总。
df.agg('max')# 每列的最大值
df.agg(['sum', 'min'])   # 将所有列聚合产生 sum 和 min 两行
df.agg({'Q1' : ['sum', 'min'], 'Q2' : ['min', 'max']})   # 系列多个聚合
# 分组后聚合
df.groupby('team').agg('max')
df.Q1.agg(['sum', 'mean'])

def mymean(x):
    return x.mean()
df.Q2.agg(['sum', mymean])

# 每列使用不同的方法进行聚合
df.agg(a=('Q1', max),
       b=('Q2', 'min'),
       c=('Q3', np.mean),
       d=('Q4', lambda s:s.sum()+1))

# 按行聚合
df.loc[:,'Q1':].agg("mean", axis="columns")
# 利用 pd.Series.add 方法对所有数据加分
# other 是 add 方法的参数
df.loc[:,'Q1':].agg(pd.Series.add, other=10)

transform()

#自身调用函数并返回一个 DataFrame。
df.transform(lambda x: x*2) # 应用匿名函数
df.transform([np.sqrt, np.exp]) # 调用多个函数
df.transform([np.abs, lambda x: x + 1])
df.transform({'A': np.abs, 'B': lambda x: x + 1}) #A列绝对值,B列加一
df.transform('abs')
df.transform(lambda x: x.abs())
# 聚合后按组显示合计
df.groupby('team').sum()
# 聚合后按原数据结构显示数据,但在指定位置上显示聚合计算后的结果
df.groupby('team').transform(sum)

copy()

s = pd.Series([1, 2], index=["a", "b"])
s_1 = s
s_copy = s.copy()
s_1 is s # True
s_copy is s # False

猜你喜欢

转载自blog.csdn.net/weixin_46277779/article/details/126106027
今日推荐