python自定义函数实例 lite_Python pandas自定义函数的使用方法示例

本文实例讲述了Python pandas自定义函数的使用方法。分享给大家供大家参考,具体如下:

自定义函数的使用

import numpy as np

import pandas as pd

# todo 将自定义的函数作用到dataframe的行和列 或者Serise的行上

ser1 = pd.Series(np.random.randint(-10,10,5),index=list('abcde'))

df1 = pd.DataFrame(np.random.randint(-10,10,(4,5)),index=list('ACBD'),columns=list('abcde'))

# todo 定义一个函数,求其和,绝对值,最大值减最小值的差值,平方

def func(x):

# print(x)

print('--------------')

num= np.max(x)-np.min(x)

a = abs(x)

b= x**2

# return num

# return a

return b

print(ser1.apply(func))

def func1(x):

# print(x)

print('--------------')

# num= np.max(x)-np.min(x)

a = abs(x)

b= x**2

# return num

# return a

return b

print(df1.apply(func1,axis = 1))

# todo 使用匿名函数实现----求其和,绝对值,最大值减最小值的差值,

print(df1.apply(lambda x:x**2,axis=1))

print('------')

print(df1.apply(lambda x:np.max(x)-np.min(x),axis=1))

print('---------')

print(df1.apply(lambda x:abs(x),axis=1))

# applymap的使用

# todo 使用applymap 因为applymap作用在每个元素上,所以不需要指定axis

print(df1.applymap(lambda x:x**2))

print('---------')

print(df1.applymap(lambda x:abs(x)))

排序

import numpy as np

import pandas as pd

ser1 = pd.Series(np.random.randint(-10,10,10),index=list('acbdfeghji'))

df1 = pd.DataFrame(np.random.randint(-10,10,(4,5)),index=list('ADBC'),columns=list('abcde'))

print(ser1)

print(df1)

print('------------------')

# todo 按照索引排序 sort_index()

# print(ser1.sort_index())#默认升序

# print(ser1.sort_index(ascending=False))#指定ascending为降序

# print(df1.sort_index())#默认行升序

# print(df1.sort_index(ascending=False))#行降序

# print(df1.sort_index(axis=1))#列升序

# print(df1.sort_index(ascending=False,axis=1))#列降序

# todo 按照值排序

print(ser1.sort_values())#默认升序

print(ser1.sort_values(ascending=False))#指定ascending为降序

# dataframe 对象比较复杂,需要按照哪一列来进行排序

print(df1.sort_values(by='a'))#默认列升序

print(df1.sort_values(by='a',ascending=False))#列降序

print(df1.sort_values(by='A',axis=1))#行升序

print(df1.sort_values(by='A',ascending=False,axis=1))#行降序

数据重构

import numpy as np

import pandas as pd

ser1 = pd.Series(np.random.randint(-10,10,10),index=[list('aabbccddee'),[1,2,1,2,1,2,1,2,1,2]])

df1 = pd.DataFrame(np.random.randint(-10,10,(4,5)),index=list('aabb'),columns=list('abcde'))

print(ser1)

print(df1)

print('-----------------------')

# todo 外层索引取值

print(ser1['a'])#获取单个外层索引

print(ser1['a':'e'])#获取多个外层

# todo 内层索引取值

print(ser1[:,1])

# todo 指定外层,内层索引取值

print(ser1['a',1])

# todo 交换分层-----swaplevel()

print(ser1.swaplevel())

# todo 将Sterise转为dataframe对象外层索引作为行索引,内层索引作为列索引

print(ser1.unstack())

# todo 将dataframe转为Sterise对象行索引作为外层索引行索引,列索引作为内层索引列

print(df1.stack())

# todo dataframe 转字典

print(df1.to_dict())

# todo dataframe 转csv文件

print(df1.to_csv())

数据连接操作

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')]

}))

数据分组之后再合并

import pandas as pd

import numpy as np

# todo 分组聚合之后数据的处理

dict_new = {

'data1':np.random.randint(5,15,8),

'data2':np.random.randint(5,15,8),

'data3':4,

'key1':list('aabbccdd'),

'key2':['one','two','three','one','two','three','one','two']

}

df1 = pd.DataFrame(dict_new,index=list('ADCBFEGH'))

print(df1)

# # todo 按照key1进行分组,

# groupy_obj = df1.groupby(by='key1')

# print(groupy_obj)

# for name,data in groupy_obj:

# print(name)

# print(data)

# # todo 分组之后进行求和操作

# sum_data_group = groupy_obj.sum()

# print(sum_data_group)

# # todo 分组之后增加前缀

# sum_data_group = sum_data_group.add_prefix('group_key1')

# print(sum_data_group)

# # todo 先用merge进行关联

# merge_df = pd.merge(df1,sum_data_group,left_on='key1',right_index=True)#左表的列名,右表的行索引名

# print(merge_df)

# todo 取数据的两列分组

groupby_obj = df1.loc[:,['data1','data2']].groupby(df1['key1'])#选区数据其中的数据,按照数据中的列进行分组

# todo 求和

data = groupby_obj.sum()

data1 = groupby_obj.transform('sum').add_prefix('trans_group')#transform 来计算会维持原来的数据结构

# todo 按行合并

print(pd.concat([df1,data1],axis=1))

希望本文所述对大家Python程序设计有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值