如何在Python中使用pandas自定义函数

本篇文章给大家分享的是有关如何在Python中使用pandas自定义函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

自定义函数的使用

如何在Python中使用pandas自定义函数

importnumpyasnp
importpandasaspd
#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定义一个函数,求其和,绝对值,最大值减最小值的差值,平方
deffunc(x):
#print(x)
print('--------------')
num=np.max(x)-np.min(x)
a=abs(x)
b=x**2
#returnnum
#returna
returnb
print(ser1.apply(func))
deffunc1(x):
#print(x)
print('--------------')
#num=np.max(x)-np.min(x)
a=abs(x)
b=x**2
#returnnum
#returna
returnb
print(df1.apply(func1,axis=1))
#todo使用匿名函数实现----求其和,绝对值,最大值减最小值的差值,
print(df1.apply(lambdax:x**2,axis=1))
print('------')
print(df1.apply(lambdax:np.max(x)-np.min(x),axis=1))
print('---------')
print(df1.apply(lambdax:abs(x),axis=1))
#applymap的使用
#todo使用applymap因为applymap作用在每个元素上,所以不需要指定axis
print(df1.applymap(lambdax:x**2))
print('---------')
print(df1.applymap(lambdax:abs(x)))

排序

importnumpyasnp
importpandasaspd
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))#行降序

数据重构

importnumpyasnp
importpandasaspd
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())
#tododataframe转字典
print(df1.to_dict())
#tododataframe转csv文件
print(df1.to_csv())

数据连接操作

importnumpyasnp
importpandasaspd
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,指定为右连接,展示右表的完整数据,不管左表有没有匹配

数据的合并

importnumpyasnp
importpandasaspd
#todonp数组的合并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))#行合并
#todopd的合并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'))#交集合并

分组

importpandasaspd
importnumpyasnp
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对象
#foriingroup_obj:
#print(i)
#print('----------')
##todo迭代分组对象的拆分
#forname,dataingroup_obj:
#print('---')
#print(name)
#print(data)
#
##todo分组对象转列表
#print(list(group_obj))
##todo分组对象转字典
#print(dict(list(group_obj)))
#
#
#
#
##todo聚合(数组产生标量的过程,常常用于分组之后的数据运算)
##todo内置的聚合函数
##todosum()求和
##todomean()平均值
##todosize()
##todomax()
##todomin()
##todocount
#
#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自定义函数
defprint1(x):
#print(x)
ret=x.max()-x.min()
returnret
print(group_obj.agg([('差值',print1)]))
#todo匿名函数
print(lambdax:x.max()-x.min())
#tododata1求最大值,data2求最小值不同的列用不同的函数
print(group_obj.agg(
{
'data1':['max'],
'data2':[('最小值','min')]
}))

数据分组之后再合并

importpandasaspd
importnumpyasnp
#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)
#forname,dataingroupy_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中使用pandas自定义函数,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注恰卡编程网行业资讯频道。

发布于 2021-03-17 20:55:05
收藏
分享
海报
0 条评论
160
上一篇:怎么在Python中使用PyExecJS库执行JS函数 下一篇:struct模块怎么在Python项目中使用
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码