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


Posted in Python onNovember 20, 2019

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

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

Python 相关文章推荐
详解【python】str与json类型转换
Apr 29 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
Jul 01 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
解决torch.autograd.backward中的参数问题
Jan 07 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
Apr 22 Python
Python实现CAN报文转换工具教程
May 05 Python
Python更换pip源方法过程解析
May 19 Python
python openpyxl模块的使用详解
Feb 25 Python
python实现的人脸识别打卡系统
May 08 Python
Django+Celery实现定时任务的示例
Jun 23 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 Python
Python求正态分布曲线下面积实例
Nov 20 #Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 #Python
Python实现数值积分方式
Nov 20 #Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 #Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 #Python
利用python实现AR教程
Nov 20 #Python
使用python实现画AR模型时序图
Nov 20 #Python
You might like
一个PHP分页类的代码
2011/05/18 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
AngularJS内置指令
2015/02/04 Javascript
js实现文本框输入文字个数限制代码
2015/12/25 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
Python群发邮件实例代码
2014/01/03 Python
python查找目录下指定扩展名的文件实例
2015/04/01 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
说出一些常用的类,包,接口
2014/09/22 面试题
红旗方阵解说词
2014/02/12 职场文书
酒店节能降耗方案
2014/05/08 职场文书
满月酒邀请函
2015/01/30 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python