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 相关文章推荐
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
对python中xlsx,csv以及json文件的相互转化方法详解
Dec 25 Python
PyTorch搭建多项式回归模型(三)
May 22 Python
python文件选择对话框的操作方法
Jun 27 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
dpn网络的pytorch实现方式
Jan 14 Python
python实现图像全景拼接
Mar 27 Python
Python读取JSON数据操作实例解析
May 18 Python
用python写一个带有gui界面的密码生成器
Nov 06 Python
next在python中返回迭代器的实例方法
Dec 15 Python
pycharm 复制代码出现空格的解决方式
Jan 15 Python
python中urllib包的网络请求教程
Apr 19 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实现图片的等比缩放和Logo水印功能示例
2017/05/04 PHP
php实现websocket实时消息推送
2018/03/30 PHP
extjs fckeditor集成代码
2009/05/10 Javascript
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
2015/03/02 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
js布局实现单选按钮控件
2020/01/17 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
浅析python继承与多重继承
2018/09/13 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
英智兴达软件测试笔试题
2016/10/12 面试题
大学生的创业计划书就该这么写
2014/01/30 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
五年级数学教学反思
2014/02/11 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
小班下学期个人总结
2015/02/12 职场文书
教师工作态度自我评价
2015/03/05 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript