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

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

(0)

相关推荐

  • Python使用Pandas读写Excel实例解析

    这篇文章主要介绍了Python使用Pandas读写Excel实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pandas是python的一个数据分析包,纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具. Pandas提供了大量能使我们快速便捷地处理数据的函数和方法. Pandas官方文档:https://pandas.pydata.org/pandas-docs/stable/ Pandas中文文档:https:/

  • python pandas dataframe 按列或者按行合并的方法

    concat 与其说是连接,更准确的说是拼接.就是把两个表直接合在一起.于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis . 函数的具体参数是: concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verigy_integrity=False) objs 是需要拼接的对象集合,一般为列表或者字典 axis=0 是

  • Python 中pandas索引切片读取数据缺失数据处理问题

    引入 numpy已经能够帮助我们处理数据,能够结合matplotlib解决我们数据分析的问题,那么pandas学习的目的在什么地方呢? numpy能够帮我们处理处理数值型数据,但是这还不够 很多时候,我们的数据除了数值之外,还有字符串,还有时间序列等 比如:我们通过爬虫获取到了存储在数据库中的数据 比如:之前youtube的例子中除了数值之外还有国家的信息,视频的分类(tag)信息,标题信息等 所以,numpy能够帮助我们处理数值,但是pandas除了处理数值之外(基于numpy),还能够帮助我

  • Windows下Python使用Pandas模块操作Excel文件的教程

    安装Python环境 ANACONDA是一个Python的发行版本,包含了400多个Python最常用的库,其中就包括了数据分析中需要经常使用到的Numpy和Pandas等.更重要的是,不论在哪个平台上,都可以一键安装,自动配置好环境,不需要用户任何的额外操作,非常方便.因此,安装Python环境就只需要到ANACONDA网站上下载安装文件,双击安装即可. ANACONDA官方下载地址:https://www.continuum.io/downloads 安装完成之后,使用windows + r

  • python中pandas.DataFrame对行与列求和及添加新行与列示例

    本文介绍的是python中pandas.DataFrame对行与列求和及添加新行与列的相关资料,下面话不多说,来看看详细的介绍吧. 方法如下: 导入模块: from pandas import DataFrame import pandas as pd import numpy as np 生成DataFrame数据 df = DataFrame(np.random.randn(4, 5), columns=['A', 'B', 'C', 'D', 'E']) DataFrame数据预览: A

  • python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)

    前言 最近在网上搜了许多关于pandas.DataFrame的操作说明,都是一些基础的操作,但是这些操作组合起来还是比较费时间去正确操作DataFrame,花了我挺长时间去调整BUG的.我在这里做一些总结,方便你我他.感兴趣的朋友们一起来看看吧. 一.创建DataFrame的简单操作: 1.根据字典创造: In [1]: import pandas as pd In [3]: aa={'one':[1,2,3],'two':[2,3,4],'three':[3,4,5]} In [4]: bb=

  • Python 中pandas.read_excel详细介绍

    Python 中pandas.read_excel详细介绍 #coding:utf-8 import pandas as pd import numpy as np filefullpath = r"/home/geeklee/temp/all_gov_file/pol_gov_mon/downloads/1.xls" #filefullpath = r"/home/geeklee/temp/all_gov_file/pol_gov_mon/downloads/26368f3

  • Python科学计算之Pandas详解

    起步 Pandas最初被作为金融数据分析工具而开发出来,因此 pandas 为时间序列分析提供了很好的支持. Pandas 的名称来自于面板数据(panel data)和python数据分析 (data analysis) .panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型. 在我看来,对于 Numpy 以及 Matplotlib ,Pandas可以帮助创建一个非常牢固的用于数据挖掘与分析的基础.而Scipy当然是另一个主要的也十分出色的科学计

  • 在Python中利用Pandas库处理大数据的简单介绍

    在数据分析领域,最热门的莫过于Python和R语言,此前有一篇文章<别老扯什么Hadoop了,你的数据根本不够大>指出:只有在超过5TB数据量的规模下,Hadoop才是一个合理的技术选择.这次拿到近亿条日志数据,千万级数据已经是关系型数据库的查询分析瓶颈,之前使用过Hadoop对大量文本进行分类,这次决定采用Python来处理数据: 硬件环境         CPU:3.5 GHz Intel Core i7         内存:32 GB HDDR 3 1600 MHz         硬

  • Python pandas常用函数详解

    本文研究的主要是pandas常用函数,具体介绍如下. 1 import语句 import pandas as pd import numpy as np import matplotlib.pyplot as plt import datetime import re 2 文件读取 df = pd.read_csv(path='file.csv') 参数:header=None 用默认列名,0,1,2,3... names=['A', 'B', 'C'...] 自定义列名 index_col='

  • Python pandas RFM模型应用实例详解

    本文实例讲述了Python pandas RFM模型应用.分享给大家供大家参考,具体如下: 什么是RFM模型 根据美国数据库营销研究所Arthur Hughes的研究,客户数据库中有3个神奇的要素,这3个要素构成了数据分析最好的指标: 最近一次消费 (Recency): 客户最近一次交易时间的间隔.R值越大,表示客户交易距今越久,反之则越近: 消费频率 (Frequency): 客户在最近一段时间内交易的次数.F值越大,表示客户交易越频繁,反之则不够活跃: 消费金额 (Monetary): 客户

  • Python3 pandas 操作列表实例详解

    1.首先需要安装pandas, 安装的时候可能由依赖的包需要安装,根据运行时候的提示,缺少哪个库,就pip 安装哪个库. 2.示例代码 import pandas as pd from pandas import ExcelWriter EX_PATH = "E:\\code\\test2.xlsx" #读取excel里面的内容 data = pd.read_excel(EX_PATH,sheet_name='Sheet1') #新增加一列内容 lista = [21, 21, 20,

随机推荐