zoukankan      html  css  js  c++  java
  • Python与Pandas关于数据处理的几个重要函数

    Python 的几个重要函数:

    1、Lambda表达式:

    语法: lambda argument1, argument2,...,argumentN:expression using arguments
    lambda实质上是一个表达式,冒号后面的部分是表达式的返回值,使用它就可以很方便的用于不允许def出现的地方,如列表中或函数的参数中。

    例1:参数无默认值,位置参数:

    f=lambda x,y,z:x+y+z
    print f(1,2,3) # 6

    例2:参数有默认值,位置参数,关键字参数:

    f=lambda a="I", b="Love", c ="Python": a+b+c
    f("We") # 'WeLovePython'

    f=lambda a="I", b="Love", c ="Python": a+b+c
    f(b="Hate") # 'IHatePython'

    f=lambda a,b="Love", c="Python": a+b+c # 需要同时有位置参数和关键字参数的时候,位置参数靠前。
    f("We",b="Hate",c="US") # 'WeHateUS'

    例3:求阶乘:结合reduce函数(稍后讲):

    from functools import reduce
    n = 6
    print(reduce(lambda x,y:x*y,range(1,n+1))) # 720

    例4:lambda的嵌套使用:

    b = lambda x:lambda y:x+y
    a = b(3) # 返回一个lambda表达式: a=lambda y:3+y
    print (a(2)) # 实际执行: a=lambda y:3+y a(2) 结果:5
    print ((b(2))(2)) # 实际执行: f=lambda y:2+y f(2) 结果:4

    相当于:
    def f(x):
    return lambda y:x+y

    a=f(3) # 返回一个lambda表达式: a=lambda y:3+y
    print(a(2)) # 实际执行: a=lambda y:3+y a(2) 结果:5
    print((b(2))(2)) # 实际执行: f_=lambda y:2+y f_(2) 结果:4

    例5:在列表中使用:用于生成跳转表:

    L = [lambda x:x2, lambda x:x3, lambda x:x**4]
    for f in L:
    print(f(2)) # 4 8 16

    例6:lambda 和 if...else 结合使用:

    f=lambda x:x2 if (x % 2)==0 else x3
    print(f(2)) # 4
    print(f(3)) # 27

    2、map函数:

    语法:map(function, iterable)
    第一个参数是函数名或lambda表达式,第二个元素传入可迭代对象。
    作用:使用函数对可迭代对象中的每个元素进行处理,得到map object,可以使用list/set函数转化为列表/集合:

    例1:

    l1 = [1,2,3,4,5]
    result = map(lambda x:x+1,l1)
    print(result) # <map object at 0x000002370FF3BB48>
    print(list(result)) # [2, 3, 4, 5, 6]

    例2:

    result = map(lambda x:"D" if x=="d" else x,s)
    print(result) # <map object at 0x000002370FF47B88>
    sl=list(result)
    print(sl) # ['a', 'b', 'c', 'D', 'e', 'f', 'g']
    new_s="".join(sl)
    print(new_s) # abcDefg

    ss=set(result)
    print(ss) # {'f', 'b', 'a', 'e', 'c', 'D', 'g'}

    print(str(result)) # <map object at 0x000002370FF47B88>

    3、reduce函数:

    语法:reduce(function, sequence[,initial=None]) function可以是lambda表达式:
    第一个参数是函数,第二个参数为序列(需要能对该序列进行for循环即可),第三个参数为initial=None。
    作用:利用function函数对sequence进行聚缩,获得一个数字。

    例1:列表求积:

    from functools import reduce
    ls = [1,2,3,4,5,6,7,8,9]
    a = reduce(lambda x,y: x*y, ls,1)
    print(a) # 362880

    例2:求阶乘

    from functools import reduce
    n = 6
    print(reduce(lambda x,y:x*y,range(1,n+1))) # 720

    4、filter函数

    语法:filter(function, iterable)
    第一个参数是function,第二个iteralbel。
    作用:过滤,留下使function返回值为True的iteralbel的元素:

    例1:# 将列表中的偶数保留:

    li=[2,3,4,5,6,7,8,9]
    li_new=filter(lambda x:x%2==0,li)
    print(list(li_new)) # [2, 4, 6, 8]

    例2:# 将年龄大于18岁的剔除

    people=[
    {'name':'aaa','age':11},
    {'name':'bbb','age':18},
    {'name':'ccc','age':20}
    ]
    print(list(filter(lambda x:x['age'] <= 18 ,people)))

    Pandas中的几个重要的函数:

    Series的几个函数:

    1、map函数:只用于 Series:

    语法:Series.map(dict) 或 Series.map(function)
    作用:对序列中满足字典或函数规定的元素进行处理,其中function只接受一个参数,即Series里对应的每个元素。

    例1:把数据集中gender列的男替换为1,女替换为0:
    1)使用字典进行映射:

    data["gender"] = data["gender"].map({"男":1, "女":0})

    2)使用 def函数:

    def gender_map(x):
    return 1 if x == "男" else 0

    data["gender"] = data["gender"].map(gender_map) #注意这里传入的是函数名,不带括号

    3) 使用 lambda表达式:

    data["gender"] = data["gender"].map(lambda x:1 if x=="男" else 0)

    2、apply函数:

    语法:Series.apply(function)
    作用:apply方法的作用原理和map方法类似,区别在于参数function可以接收多个参数,因此实现的功能可以更复杂。

    例1:假设在数据统计的过程中,年龄age列有较大误差,需要对其进行调整(加上或减去一个值),

    由于这个加上或减去的值未知,故在定义函数时,需要加多一个参数bias,此时用map方法是操作不了的(传入map的函数只能接收一个参数),
    apply方法则可以解决这个问题:
    def apply_age(x,bias):
    return x+bias

    # 以args=元组的方式传入额外的参数
    data["age"] = data["age"].apply(apply_age,args=(-3,)) # 缺省的参数就是Series里的元素
    data["age"] = data["age"].apply((lambda x,bias:x+bias),args=(-3,))
    data["age"] = data["age"].apply(lambda x:x-3) # 如果 bias=-3是固定的,可以直接这样。

    例2:map和apply在function只接受一个参数时,效果一样:

    import pandas as pd
    import numpy as np

    df_hz["净重是否一致?"]=df_hz["净重是否一致?"].apply(lambda x:"一致"if x==True else "不一致")
    df_hz["净重是否一致?"]=df_hz["净重是否一致?"].map(lambda x:"一致" if x==True else "不一致")

    df = pd.DataFrame(np.random.rand(2, 2), columns=list('AB')) # 形状为2x2的0-1之间的数构成的dataframe
    print(df)
    df["A"]=df["A"].apply((lambda x,y:x+y),args=(1,))
    print(df)

    df_score = pd.DataFrame(np.random.rand(2, 2)*100, columns=list('AB')) # 形状为2x2的0-1之间的数构成的dataframe
    print(df_score)
    df_score["A"]=df_score["A"].apply(lambda x:"优秀"if x>=80 else "一般")
    print(df_score)

    df_score2 = pd.DataFrame(np.random.rand(2, 2)*100, columns=list('AB')) # 形状为2x2的0-1之间的数构成的dataframe
    print(df_score2)
    df_score2["A"]=df_score2["A"].map(lambda x:"优秀"if x>=80 else "一般")
    print(df_score2)

    DataFrame的几个函数:

    1、apply函数:

    语法:dataframe.apply(function,axis=0)
    作用:对dataframe的多行或多列或整个dataframe的每行或每列(Series)进行操作,根据function的类型(普通函数或聚合函数),返回dataframe或聚合Series。
    function接收的参数是序列,而不是元素。

    例1:

    df = pd.DataFrame(np.random.rand(6, 3), columns=list('ABC'))
    print(df)
    df1=df.apply(lambda x:x*100,axis=1) # x为行Series,按行操作元素,返回一个结构和原dataframe一样的新的dataframe
    print(df1)
    A B C
    0 33.538653 71.249145 5.037846
    1 33.046605 19.985572 82.762447
    2 14.170736 96.949203 19.425454
    3 57.596054 8.871985 84.138249
    4 60.109552 46.197523 36.904565
    5 41.205720 64.347780 74.839440

    df2=df[["A","C"]].apply(lambda x:x*-100,axis=0) # x为列Series,按列操作元素,返回一个只含"A"和"C"列的dataframe
    print(df2)
    A C
    0 -42.431966 -15.729176
    1 -1.908547 -26.970564
    2 -54.378145 -1.202459
    3 -64.568167 -9.193546
    4 -91.014507 -13.606579
    5 -93.857594 -34.910796

    例2:

    df_new=df[["B","C"]].apply(np.sum, axis=0) # x为列Series,按列求和,返回一个序列 Series
    print(df_new)

    2、applymap函数:

    语法:dataframe.applymap(function)
    作用:对DataFrame中的每个元素执行指定函数的操作:

    例1:对dataframe中所有元素保留两位小数:

    df = pd.DataFrame(
    {
    "A":np.random.randn(5),
    "B":np.random.randn(5),
    "C":np.random.randn(5),
    "D":np.random.randn(5),
    "E":np.random.randn(5),
    }
    )
    print(df)

    df_new=df.applymap(lambda x:"%.2f" % x) # x为元素
    df_new=df.apply(lambda x:"%.2f" % x) # 使用apply会报错,因为 x为series不能作为float使用
    print(df_new)

          A         B         C         D         E
    

    0 -1.053736 0.272299 -0.999303 1.022918 0.401127
    1 0.129401 0.387668 -1.225724 -0.015265 0.210593
    2 0.397829 0.707525 -0.628846 -1.723541 -0.227998
    3 0.977949 -0.874221 1.570470 0.818799 0.371058
    4 -1.238976 1.072337 -0.076957 -0.204579 -0.708090

       A      B      C      D      E
    

    0 -1.05 0.27 -1.00 1.02 0.40
    1 0.13 0.39 -1.23 -0.02 0.21
    2 0.40 0.71 -0.63 -1.72 -0.23
    3 0.98 -0.87 1.57 0.82 0.37
    4 -1.24 1.07 -0.08 -0.20 -0.71

    3、apply与applymap的区别:

    1)参数有区别,dataframe.apply需要指定axis,dataframe.applymap不需要;
    2)参数里function接收的参数类型不一样,dataframe.apply的function接收的是Series,dataframe.applymap接收的是单个元素。

    例1:验证类型:

    df = pd.DataFrame(
    {
    "A":np.random.randn(5),
    "B":np.random.randn(5),
    "C":np.random.randn(5),
    "D":np.random.randn(5),
    "E":np.random.randn(5),
    }
    )

    df2=df[["A","C"]].apply(lambda x:type(x),axis=0) # 验证apply里function接收到的x的类型
    df3=df[["A","C"]].applymap(lambda x:type(x)) # 验证 x的类型
    print(df2)

    A <class 'pandas.core.series.Series'>
    C <class 'pandas.core.series.Series'>
    dtype: object

    print(df3)
    A C
    0 <class 'float'> <class 'float'>
    1 <class 'float'> <class 'float'>
    2 <class 'float'> <class 'float'>
    3 <class 'float'> <class 'float'>
    4 <class 'float'> <class 'float'>
    作者:Collin wx:pxy123abc tel:17763230890

  • 相关阅读:
    “<”特殊符号写法
    js中,符合属性的js写法是讲下横杆去掉
    Windows 搭建WAMP+Mantis
    Windows server 2012 R2 服务器用户自动锁定
    对域用户设置为本地管理员权限
    windows 域控用户记住最后一次登录用户名
    redhat7.6 配置主从DNS
    redhat7.6 DNS配置正向解析
    redhat7.6 AIDE 系统文件完整性检查工具
    redhat7.6 httpd 匿名目录 目录加密 域名跳转
  • 原文地址:https://www.cnblogs.com/Collin-pxy/p/14006216.html
Copyright © 2011-2022 走看看