导航:首页 > 源码编译 > pandaspython算法

pandaspython算法

发布时间:2023-02-08 03:46:51

python数据分析: 初识Pandas,理解Pandas实现和原理

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

01 重要的前言

这段时间和一些做数据分析的同学闲聊,我发现数据分析技能入门阶段存在一个普遍性的问题,很多凭着兴趣入坑的同学,都能够很快熟悉Python基础语法,然后不约而同的一头扎进《利用Python进行数据分析》这本经典之中,硬着头皮啃完之后,好像自己什么都会了一点,然而实际操作起来既不知从何操起,又漏洞百出。

至于原因嘛,理解不够,实践不够是两条老牌的拦路虎,只能靠自己来克服。还有一个非常有意思且经常被忽视的因素——陷入举三反一的懵逼状态。

什么意思呢?假如我是个旱鸭子,想去学游泳,教练很认真的给我剖析了蛙泳的动作,扶着我的腰让我在水里划拉了5分钟,接着马上给我讲解了蝶泳,又是划拉了5分钟,然后又硬塞给我潜泳的姿势,依然是划拉5分钟。最后,教练一下子把我丢进踩不到底的泳池,给我呐喊助威。

作为一个还没入门的旱鸭子,教练倾囊授了我3种游泳技巧,让我分别实践了5分钟。这样做的结果就是我哪一种游泳技巧也没学会,只学会了喝水。当一个初学者一开始就陷入针对单个问题的多种解决方法,而每一种方法的实践又浅尝辄止,在面对具体问题时往往会手忙脚乱。

拿Pandas来说,它的多种构造方式,多种索引方式以及类似效果的多种实现方法,很容易把初学者打入举三反一的懵逼状态。所以,尽量避开这个坑也是我写Pandas基础系列的初衷,希望通过梳理和精简知识点的方式,给需要的同学一些启发。目前暂定整个基础系列分为4篇,基础篇过后便是有趣的实战篇。

下面开始进入正题(我真是太唠叨了)。

02 Pandas简介

江湖上流传着这么一句话——分析不识潘大师(PANDAS),纵是老手也枉然。

Pandas是基于Numpy的专业数据分析工具,可以灵活高效的处理各种数据集,也是我们后期分析案例的神器。它提供了两种类型的数据结构,分别是DataFrame和Series,我们可以简单粗暴的把DataFrame理解为Excel里面的一张表,而Series就是表中的某一列,后面学习和用到的所有Pandas骚操作,都是基于这些表和列进行的操作(关于Pandas和Excel的形象关系,这里推荐我的好朋友张俊红写的《对比EXCEL,轻松学习Python数据分析》)。

这里有一点需要强调,Pandas和Excel、SQL相比,只是调用和处理数据的方式变了,核心都是对源数据进行一系列的处理,在正式处理之前,更重要的是谋定而后动,明确分析的意义,理清分析思路之后再处理和分析数据,往往事半功倍。

03 创建、读取和存储

1、创建

在Pandas中我们想要构造下面这一张表应该如何操作呢?

别忘了,第一步一定是先导入我们的库——import pandas as pd

构造DataFrame最常用的方式是字典+列表,语句很简单,先是字典外括,然后依次打出每一列标题及其对应的列值(此处一定要用列表),这里列的顺序并不重要:

左边是jupyter notebook中dataframe的样子,如果对应到excel中,他就是右边表格的样子,通过改变columns,index和values的值来控制数据。

PS,如果我们在创建时不指定index,系统会自动生成从0开始的索引。

2、 读取

更多时候,我们是把相关文件数据直接读进PANDAS中进行操作,这里介绍两种非常接近的读取方式,一种是CSV格式的文件,一种是EXCEL格式(.xlsx和xls后缀)的文件。

读取csv文件:

engine是使用的分析引擎,读取csv文件一般指定python避免中文和编码造成的报错。而读取Excel文件,则是一样的味道:

非常easy,其实read_csv和read_excel还有一些参数,比如header、sep、names等,大家可以做额外了解。实践中数据源的格式一般都是比较规整的,更多情况是直接读取。

3、存储

存储起来一样非常简单粗暴且相似:

04 快速认识数据

这里以我们的案例数据为例,迅速熟悉查看N行,数据格式概览以及基础统计数据。

1、查看数据,掐头看尾

很多时候我们想要对数据内容做一个总览,用df.head()函数直接可以查看默认的前5行,与之对应,df.tail()就可以查看数据尾部的5行数据,这两个参数内可以传入一个数值来控制查看的行数,例如df.head(10)表示查看前10行数据。

2、 格式查看

df.info()帮助我们一步摸清各列数据的类型,以及缺失情况:

从上面直接可以知道数据集的行列数,数据集的大小,每一列的数据类型,以及有多少条非空数据。

3、统计信息概览

快速计算数值型数据的关键统计指标,像平均数、中位数、标准差等等。

我们本来有5列数据,为什么返回结果只有两列?那是因为这个操作只针对数值型的列。其中count是统计每一列的有多少个非空数值,mean、std、min、max对应的分别是该列的均值、标准差、最小值和最大值,25%、50%、75%对应的则是分位数。

05 列的基本处理方式

这里,我们采用SQL四大法宝的逻辑来简单梳理针对列的基本处理方式——增、删、选、改。

温馨提示:使用Pandas时,尽量避免用行或者EXCEL操作单元格的思维来处理数据,要逐渐养成一种列向思维,每一列是同宗同源,处理起来是嗖嗖的快。

1、增

增加一列,用df[‘新列名’] = 新列值的形式,在原数据基础上赋值即可:

2、删:

我们用drop函数制定删除对应的列,axis = 1表示针对列的操作,inplace为True,则直接在源数据上进行修改,否则源数据会保持原样。

3、选:

想要选取某一列怎么办?df[‘列名’]即可:

选取多列呢?需要用列表来传递:df[[‘第一列’,‘第二列’,‘第三列’…]]

4、 改:

好事多磨,复杂的针对特定条件和行列的筛选、修改,放在后面结合案例细讲,这里只讲一下最简单的更改:df[‘旧列名’] = 某个值或者某列值,就完成了对原列数值的修改。

06 常用数据类型及操作

1、字符串

字符串类型是最常用的格式之一了,Pandas中字符串的操作和原生字符串操作几乎一毛一样,唯一不同的是需要在操作前加上".str"。

小Z温馨提示:我们最初用df2.info()查看数据类型时,非数值型的列都返回的是object格式,和str类型深层机制上的区别就不展开了,在常规实际应用中,我们可以先理解为object对应的就是str格式,int64对应的就是int格式,float64对应的就是float格式即可。

在案例数据中,我们发现来源明细那一列,可能是系统导出的历史遗留问题,每一个字符串前面都有一个“-”符号,又丑又无用,所以把他给拿掉:

一般来说清洗之后的列是要替换掉原来列的:

2、 数值型

数值型数据,常见的操作是计算,分为与单个值的运算,长度相等列的运算。

以案例数据为例,源数据访客数我们是知道的,现在想把所有渠道的访客都加上10000,怎么操作呢?

只需要选中访客数所在列,然后加上10000即可,pandas自动将10000和每一行数值相加,针对单个值的其他运算(减乘除)也是如此。

列之间的运算语句也非常简洁。源数据是包含了访客数、转化率和客单价,而实际工作中我们对每个渠道贡献的销售额更感兴趣。(销售额 = 访客数 X 转化率 X 客单价)

对应操作语句:df[‘销售额’] = df[‘访客数’] * df[‘转化率’] * df[‘客单价’]

但为什么疯狂报错?

导致报错的原因,是数值型数据和非数值型数据相互计算导致的。PANDAS把带“%”符号的转化率识别成字符串类型,我们需要先拿掉百分号,再将这一列转化为浮点型数据:

要注意的是,这样操作,把9.98%变成了9.98,所以我们还需要让支付转化率除以100,来还原百分数的真实数值:

然后,再用三个指标相乘计算销售额:

3、时间类型

PANDAS中时间序列相关的水非常深,这里只对日常中最基础的时间格式进行讲解,对时间序列感兴趣的同学可以自行查阅相关资料,深入了解。

以案例数据为例,我们这些渠道数据,是在2019年8月2日提取的,后面可能涉及到其他日期的渠道数据,所以需要加一列时间予以区分,在EXCEL中常用的时间格式是’2019-8-3’或者’2019/8/3’,我们用PANDAS来实现一下:

在实际业务中,一些时候PANDAS会把文件中日期格式的字段读取为字符串格式,这里我们先把字符串’2019-8-3’赋值给新增的日期列,然后用to_datetime()函数将字符串类型转换成时间格式:

转换成时间格式(这里是datetime64)之后,我们可以用处理时间的思路高效处理这些数据,比如,我现在想知道提取数据这一天离年末还有多少天(‘2019-12-31’),直接做减法(该函数接受时间格式的字符串序列,也接受单个字符串):

② python:pandas计算时间差

import pandas as pd

方法一:
先利用to_datetime转换为时间格式,tm列的数据形式为'yyyy-MM-dd HH:mm:ss'
df['tm_1'] = pd.to_datetime(df['tm_1'])

df['tm_2'] = pd.to_datetime(df['tm_2'])

利用".dt.seconds"转换为秒,除以相对于的间隔数得到分钟、小时等
df['diff_time'] = (df['tm_1'] - df['tm_2']).dt.seconds/3600

利用round函数可进行四舍五入
df['diff_time'] = round(df['diff_time'])

方法二,日期相减变为小时;变为天的话将h替换为D即可:
df['diff_time'] = (df['tm_1'] - df['tm_2']).values/np.timedelta64(1, 'h')

③ Python pandas数据计数函数value_counts

value_counts是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中个数,类似Excel里面的count函数

其是pandas下面的顶层函数,也可以作用在Series、DataFrame下

常规用法:

pandas 的 value_counts() 函数可以对Series里面的每个值进行计数 并且 排序,默认是降序

可以看出,既可以对分类变量统计,也可以对连续数值变量统计

如果是要对结果升序排列,可以添加 ascending=True 来改变

如果不想看统计的个数,而是想看占比,那么可以设置 normalize=True 即可,结果是小数形式

可以通过apply,对每一列变量进行统计

以上是自己实践中遇到的一些点,分享出来供大家参考学习,欢迎关注DataShare公众号

④ 新手关于python中pandas函数的使用

利用Python的pandas数据结构来读取excel表格的数据,部分代码如下:

#-*- coding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt

catering_data="catering_sale.xls"
data=pd.read_excel(catering_data,index_col=u'日期')
#读取数据,指定"日期"列为索引列

大多数书上都是这样写的,但是在Python2.7上运行时出现错误。(没有在Python3.x版本试过)
出现了如下问题:
这里写图片描述
使用help(pd.read_excel)发现参数中有必选参数sheetname,加入到函数中,代码如下:

#-*- coding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt

catering_data="catering_sale.xls"
data=pd.read_excel(catering_data,sheetname=0,index_col=u'日期')

运行成功。
sheetname=0 的意思是:读取xls文件中的第一个表格。(假设文件中有很多个表格)
另外,也可以将文件转换成csv格式,就不需要这个参数了。代码如下:

catering_data="catering_sale.csv"
data=pd.read_csv(catering_data)

⑤ python--pandas分组聚合

groupby 方法是pandas中的分组方法,对数据框采用 groupby 方法后,返回的是 DataFrameGroupBy 对象,一般分组操作后会进行聚合操作。

对数据框按 A 列进行分组,产生分组数据框。分组数据框是可迭代对象,可以进行循环遍历,可以看出在循环中,每个元素的类型是元组,
元组的第一个元素是分组值,第二个元素是对应的分组数据框。

可以对分组后的数据框直接使用聚合方法 agg ,对分组数据框的每一列计算统计函数值。

可以根据数据框外的序列数据对数据框进行分组,需要注意 序列长度需要与数据框行数相同

可以根据数据框的多列对数据框进行分组。

根据 A , B 列进行分组,然后求和。

可以根据索引对数据框进行分组,需要设置 level 参数。

数据框只有一层索引,设置参数 level=0 。

当数据框索引有多层时,也可以根据需求设置 level 参数,完成分组聚合。

设置 level 参数,如需要根据第一层索引,即 id1 进行分组,可以设置 level=0 或 level='id1' 完成分组聚合。

分组后一般会进行聚合操作,用 agg 方法进行聚合。

对分组后数据框使用单个函数进行聚合,单个聚合函数会对每列进行计算,然后合并返回。聚合函数以字符串的形式传入。

可以对分组后的数据指定列进行分组聚合。需要注意 子列需要用[]包裹

聚合函数也可以传入自定义的匿名函数。

聚合函数可以是多个函数。聚合时,多个聚合函数会对每列进行计算,然后合并返回。聚合函数以列表的形式传入。

聚合返回后的数据列名有两层索引,第一层是聚合的列名,第二层是使用的聚合函数名。如果需要对返回的聚合函数名重命名,
需要在传参时,传入元组,第一个元素为聚合函数名,第二个元素为聚合函数。

同样,也可以传入匿名函数。

如果需要对不同的列进行不同的聚合计算,则需要传入字典的形式。

可以重命名聚合后的列名,注意 只能对一列传入一个聚合函数时有效

⑥ python(pandas模块)

Pandas是Python的一个数据分析包,最初由AQR Capital
Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的Pydata开发team继续开发和维护,属于PyData项目的一部分,pandas最初被作为金融数据分析工具而开发出来,因此pandas为时间序列分析提供了很好的支持。

Pandas的名称来自于面板数据和python数据分析。panel
data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。

Pandas数据结构:

Series:一维数组,与numpy中的一维array类似。二者与Python基本的数据结构list相近,Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在series中。

Time-series:以时间为索引的series。

DataFrame:二维的表格型数据结构,很多功能与R中的data.frame类似,可以将DataFrame理解为Series的容器。

Panel :三维的数组,可以理解为DataFrame的容器。

Panel4D:是像Panel一样的4维数据容器。

PanelND:拥有factory集合,可以创建像Panel4D一样N维命名容器的模块。

⑦ Python Pandas——Read_csv详解

可以指定整个DataFrame或各个列的数据类型:

pandas提供了多种方法来确保列仅包含一个dtype。例如,可以使用read_csv()的converters参数:

或者,可以在读取数据后使用to_numeric()函数强进行类型转换。

可以通过指定dtype ='category'或dtype = CategoricalDtype(类别,有序)直接解析类别列。

可以使用dict指定将某列为Category类型:

指定dtype ='category'将导致无序分类,其类别是数据中观察到的唯一值。

要更好地控制类别和顺序,可以创建CategoricalDtype,然后将其传递给该列的dtype。

使用dtype = CategoricalDtype时,dtype.categories之外的“意外”值将被视为缺失值。

文件可能包含标题行,也可能没有标题行。 pandas假定第一行应用作列名:

通过指定name与header,可以重命名列以及是否丢弃标题行:

如果标题不在第一行中,则将行号传递给标题,将跳过header前面的行:

如果文件或标题包含重复的名称,默认情况下,pandas会将它们区分开,以防止覆盖数据.

usecols参数允许您使用列名,位置号或可调用的方法选择文件中列的任何子集.

如果指定了comment参数,则将忽略注释行。 默认情况下,空行也将被忽略。

如果skip_blank_lines = False,则read_csv将不会忽略空行:

警告:被忽略的行的存在可能会导致涉及行号的歧义; 参数标题使用行号(忽略注释/空行),而行首使用行号(包括注释/空行).

如果同时指定了skiprows和header,则header将相对于skiprows的末尾。 例如:

为了更好地使用日期时间数据,read_csv()使用关键字参数parse_dates和date_parser允许用户指定列的日期/时间格式,将string转换为日期时间对象。

通常,我们可能希望分别存储日期和时间数据,或分别存储各种日期字段。 parse_dates关键字可用于指定列的组合,以从中解析日期和/或时间。 您可以指定要parse_dates的列或嵌套列表,结果日期列将被添加到输出的前面(以便不影响现有的列顺序),新的列名为各列Name的连接。

默认情况下,解析器会删除组件日期列,可以选择通过keep_date_col关键字保留它们:

请注意,如果您希望将多个列合并为一个日期列,则必须使用嵌套列表。 换句话说,parse_dates = [1,2]表示第二和第三列应分别解析为单独的日期列,而parse_dates = [[1,2]]意味着应将这两列解析为单个列。

还可以使用字典来指定自定义名称列:

重要的是要记住,如果要将多个文本列解析为单个日期列,则在数据前添加一个新列。

index_col参数基于这组新列而不是原始数据列:

注意:如果列或索引包含不可解析的日期,则整个列或索引将作为对象数据类型原样返回。 对于非标准日期时间解析,请在pd.read_csv之后使用to_datetime()。

注意:read_csv具有用于解析iso8601格式的日期时间字符串的fast_path,例如“ 2000-01-01T00:01:02 + 00:00”和类似的变体。 如果可以安排数据以这种格式存储日期时间,则加载时间将明显缩短,约20倍。

最后,解析器允许您指定自定义date_parser函数,以充分利用日期解析API的灵活性:

Pandas不能原生表示具有混合时区的列或索引。 如果CSV文件包含带有时区混合的列,则默认结果将是带有字符串的object-dtype列,即使包含parse_dates。

要将混合时区值解析为datetime列,请将部分应用的to_datetime()传递给utc = True作为date_parser。

⑧ Python之pandas数据整理及分组统计

对数据进行整理以及分组统计

一、数据整理

1、行、列的插入与删除

2、索引整理

3、重复值处理

4、排序,排名

5、数据框连接

6、数据分段

pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)

x:需要切分的数据

bins:切分区域

right : 是否包含右端点默认True,包含

labels:对应标签,用标记来代替返回的bins,若不在该序列中,则返回NaN

retbins:是否返回间距bins

precision:精度

include_lowest:是否包含左端点,默认False,不包含

7、多级索引

8、字符串处理

类似于Python

二、分组统计

阅读全文

与pandaspython算法相关的资料

热点内容
英语电影读后感100词 浏览:154
征途命令 浏览:695
抢版电影啥意思 浏览:180
xp编程器软件 浏览:397
matlab细菌觅食算法 浏览:784
手机怎么建压缩包 浏览:941
大象里面的文件夹怎么打开 浏览:954
安卓微信为什么发不了照片 浏览:349
补办绿本解压违法吗 浏览:604
gccwindows命令 浏览:535
日本性电影 浏览:331
都市主角推到母亲姐姐姨妈的长篇小说 浏览:917
免费不用下载网站 浏览:893
可以播放的欧美男男电影 浏览:949
ldx218舵机用单片机控制 浏览:898
河南dns服务器地址大全 浏览:775
中字四级片 浏览:769
青岛本地服务器地址 浏览:987
白鹿原小说免费阅读 浏览:356
女主姓简的小说 浏览:210