当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Python pandas自定义函数的使用方法示例(2)

    栏目:Linux/apache问题 时间:2019-12-03 10:57

    import numpy as np
    import pandas as pd
    df1 = pd.DataFrame(
     {'key1':list('abcdefgh'),'data1':np.random.randint(-5,10,8)}
    )
    df2 = pd.DataFrame(
     {'key2':list('defgh'),'data2':np.random.randint(-5,10,5)}
    )
    print(df1)
    print(df2)
    print('--------------------------')
    # todo 链接
    # print(pd.merge(df1,df2,on='key'))# key相同时 通过key连接df1,df2
    # print(pd.merge(df1,df2))#不指定,连接df1,df2默认通过相同的列来连接
    # print(pd.merge(df1,df2,on=data1))#data1相同时 通过data1连接df1,df2
    #todo 交集
    print(pd.merge(df1,df2,left_on='key1',right_on='key2'))
    #todo 并集
    print(pd.merge(df1,df2,how='outer',left_on='key1',right_on='key2'))
    #todo 左连接
    print(pd.merge(df1,df2,how='left',left_on='key1',right_on='key2'))
    #todo 右连接
    print(pd.merge(df1,df2,how='right',left_on='key1',right_on='key2'))
    # todo 通过行索引来指定
    print(pd.merge(df1,df2,left_on='data1',right_index=True))#left_on指定左表的列索引为外健,right_index作业为右表的行索引作为外检
    print(pd.merge(df1,df2,left_index=True,right_index=True))#left_index,right_index,默认的情况下,将两张表按照航索引的相同情况,合成一条数据
    print(pd.merge(df1,df2,how='left',left_index=True,right_index=True))# 按照行进行连接,也能指定链接方式
    
    

    注意点:

    1.how = inner,默认的,内连接,多表的交集
    2.how = outer,外连接,多表的并集
    3.how = left,指定为左连接,展示左表的完整数据,不管右表有没有匹配
    4.how = right,指定为右连接,展示右表的完整数据,不管左表有没有匹配

    数据的合并

    import numpy as np
    import pandas as pd
    # todo np数组的合并 np.concatenate() ,参与合并的数组,纬度大小是一致的,axis=1 为行排序
    # arr1 = np.random.randint(10,20,(3,4))
    # arr2 = np.random.randint(10,20,(3,4))
    # print(arr1)
    # print(arr2)
    # print('-------------')
    # print(np.concatenate((arr1,arr2),axis=0)) #列合并
    # print('----------')
    # print(np.concatenate((arr1,arr2),axis=1)) # 行合并
    # todo pd的合并 pd.concat()
    # ser1 = pd.Series(np.random.randint(10,20,3))
    # ser2 = pd.Series(np.random.randint(10,20,5))
    # ser3 = pd.Series(np.random.randint(10,20,7))
    # print(ser1)
    # print(ser2)
    # print(ser3)
    # print('-------------')
    #
    # print(pd.concat([ser1,ser2,ser3]))#多个Serise 对象需要用【】包起来,默认是列合并
    # print(pd.concat([ser1,ser2,ser3],axis=1))# axis=1 行合并 ,不够的部分用NAN填充
    # print(pd.concat([ser1,ser2,ser3],axis=1,join='outer'))# 默认是outer 并集
    df1 = pd.DataFrame(
     {'key1':list('abcdefgh'),'data1':np.random.randint(-5,10,8)}
    )
    df2 = pd.DataFrame(
     {'key2':list('abcde'),'data2':np.random.randint(-5,10,5)}
    )
    print(pd.concat((df1,df2)))# 默认按照列合并
    print(pd.concat((df1,df2),axis=1))# 按照行合并
    print(pd.concat((df1,df2),axis=1,join='inner'))# 交集合并
    
    

    分组

    import pandas as pd
    import numpy as np
    df1 = pd.DataFrame(
     {'key1':list('abcdefgh'),'data1':np.random.randint(-5,10,8),'key2':list('11223344'),'data2':np.random.randint(-5,10,8)}
    )
    print(df1)
    df2 = pd.DataFrame(
     {'key2':list('abcde'),'data2':np.random.randint(-5,10,5)}
    )
    print('----------------')
    # todo 分组 groupby()
    group_obj = df1.groupby(by='key2')#通过key1进行分组,返回一个分组对象,分组之后可以用函数进行下一步处理,计算过程中,非数字的数据不参与计算
    # print(group_obj)
    # print('--------rrrr-------')
    # print(group_obj.sum()) # 分组求和
    # print(group_obj.mean()) # 分组求均值
    # print(group_obj.size()) # 每个分组的元素个数
    # print(group_obj.count()) # 每个分组之后,列名里面的个数
    #
    # # todo 迭代分组对象 注意点:1.每一个元素形式(分组名,属于分组的数据)2.属于该分组的数据,也是dataframe对象
    # for i in group_obj:
    #  print(i)
    # print('----------')
    # # todo 迭代分组对象的拆分
    # for name,data in group_obj:
    #  print('---')
    #  print(name)
    #  print(data)
    #
    # # todo 分组对象转列表
    # print(list(group_obj))
    # # todo 分组对象转字典
    # print(dict(list(group_obj)))
    #
    #
    #
    #
    # # todo 聚合(数组产生标量的过程,常常用于分组之后的数据运算)
    # # todo 内置的聚合函数
    # # todo sum() 求和
    # # todo mean()平均值
    # # todo size()
    # # todo max()
    # # todo min()
    # # todo count
    #
    # print(group_obj.describe()) #查看具体的聚合数据
    # todo 使用单个内置函数
    # print(group_obj.agg('max'))#agg里面可以填写内置函数,如果需要使用内置的函数,要用字符串的形式填写
    # print(group_obj.agg('min'))
    # # todo 使用多个内置函数
    # print(group_obj.agg(['max','min','mean']))#需要用列表的形式
    # # todo 使用内置的函数取中文别名
    # print(group_obj.agg([('最大值','max'),('最小值','min'),('均值','mean')]))# 第一个参数是别名
    # todo 自定义函数
    def print1(x):
     # print(x)
     ret = x.max()-x.min()
     return ret
    print(group_obj.agg([('差值',print1)]))
    # todo 匿名函数
    print(lambda x:x.max()-x.min())
    # todo data1求最大值,data2 求最小值 不同的列用不同的函数
    print(group_obj.agg(
     {
      'data1':['max'],
      'data2':[('最小值','min')]
     }))