pandas
文章平均质量分 53
S_o_l_o_n
logic
展开
-
pandas中parquet文件对于缺失值的交互处理
当把一个带有缺失值的df写入到parquet文件,parquet的缺失值的处理是和python兼容的,会一律把缺失值转为None,无论原始的df中的缺失值是None还是NaN。由于pandas本身在将数据转为df时,会额外对缺失值进行处理,处理原则是,如果某列的类型推断为object,那么缺失值会保留原来的值,即None或NaN,但是如果带有缺失值的列推断为数值类型,那么缺失值会全部被转为浮点数类型的NaN,这时原来的None缺失值也会被转为NaN。pandas对于缺失值的处理在。原创 2022-11-02 10:42:55 · 583 阅读 · 0 评论 -
高效数据存储格式Parquet
Parquet还使用了字典编码,以及RLE编码(Run Length Encoding),将数据值映射成数字,然后保存一个字典映射,同时记录某个值连续重复的次数,这样不用反复的保存一些占用空间较大的数据,特别是对于字符类型的数据,这种方式尤其对于重复值较多的chunk,非常高效,实际上我们的表格数据经常某些列具有较多的重复数据。因此,Parquet的这些编码方式,可以高效的节省空间,减少实际数据的IO,但是需要更多的metadata的解析,将IO密集部分变成了CPU密集的工作,CPU当然快多了。原创 2022-10-09 23:37:39 · 3362 阅读 · 0 评论 -
pandas一维数据分组之cut和qcut
对于一个一维的数值型数据,我们有时候想对其根据数值区间或者根据分位数进行分组,然后再做后续的分析,本文介绍pandas里的cut和qcut函数,实现这种快速分组操作。cutcut函数,将一维序列中的数值打上区间标签,参数签名如下:pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False,duplicates='raise')其中x...原创 2021-12-15 17:48:26 · 2759 阅读 · 0 评论 -
pandas pivot_table之数值精度丢失陷阱
pandas的pivot_table函数可以指定行列值重新制表,并且对于同一行列索引下的多个值会进行聚合运算,默认是均值运算,因此,这里如果我们默认其aggfunc的均值运算,那么会存在将其他数值类型转为浮点值的行为,如果原本是数值较大的整型,超出了64位浮点数能精确表示的最大范围的话,这里就会存在精度丢失现象。 尽管我们可以让aggfunc=lambda x:x,即不对value做任何操作,这样不会存在均值计算,但是实际上还会存在精度丢失的情况。看如下是pivot_tab...原创 2021-11-07 16:56:21 · 1033 阅读 · 0 评论 -
pandas DataFrame打印输出列名不对齐解决办法
pandas显示对于字符宽度的控制默认是英文,当DataFrame的列名含有中文时,pandas就无法准确的控制列宽,从而导致列名和列没有对齐;对此,我们只要修改下pandas显示的默认设置即可,将两项设置都设为True即可,具体如下:pd.set_option('display.unicode.ambiguous_as_wide', True)pd.set_option('display.unicode.east_asian_width', True)...原创 2021-05-19 10:11:09 · 5944 阅读 · 1 评论 -
python中时间戳(epoch)和日期的相互转换
1 epoch时间转日期使用标准库datetime,具体来说,使用datetime.datetime.fromtimestamp(timestamp,tz=None)方法。其中timestamp为浮点数,表示epoch秒数,tz表示时区,默认为None,表示原创 2020-12-01 22:38:49 · 4924 阅读 · 1 评论 -
numpy多维数组获取指定矩形区域
ndarray中,当我们想获取其指定行列的子矩形局域时,该如何获取?一般的,我们容易误认为通过传入相应索引的数组来直接获取,但是结果出乎我们预期,这时我们得到的却是相应数组构成的坐标对应于ndarray中的元素构成的一维数组。如下所示。上面例子中,我们想获取arr对象中的右下角四个元素构成的矩形子区域,所以我们尝试通过arr[[1,2],[1,2]]的方式获取,结果返回的是(1,1),(2,2)坐标对应的元素,并不是我们想要的矩形区域。实际上,对于numpy的ndarray,当我们对行...原创 2020-09-15 22:07:25 · 2248 阅读 · 0 评论 -
pandas.errors.ParserError: Error tokenizing data. C error: EOF inside string starting at row 56789
笔者在用pandas读取csv文件时遇到该报错,根据报错提示,是因为在解析时出现了意外的文件结束符。在具体的报错信息中,会提示第几行触发异常,所以笔者通过查看原始原件的相应的行,发现是该行出现了乱码,并且乱码中有一个双引号;所以实际上,该报错是因为pandas读取csv文件时,会默认把csv文件中两个双引号之间的内容解析为一个string,作为一个字段域读入,并且忽略两个双引号之间的分隔符。所以,在默认方式下,一旦文件中出现了奇数个双引号,那么最后一个引号直到文件结束也没有对应的结束引号形成单...原创 2020-09-12 20:07:41 · 8384 阅读 · 4 评论 -
pandas Groupby对象apply函数的返回类型
pandas中,groupby对象有一个很灵活的函数apply,其对每个分组执行相应的操作,具体操作由传入的参数func实现,*args和**kwargs表示传给func的参数,这里func函数的第一个参数必须是以dataframe类型。GroupBy.apply(func,*args,**kwargs) 本文要说明的问题是,groupby的apply函数返回的类型是什么。官方文档中,说其会返回一个dataframe或者一个series,那么在什么情况下返回的是d...原创 2020-09-09 16:25:52 · 3229 阅读 · 0 评论 -
matplotlib x轴日期(字符串等其他类型也可)倾斜显示
在画时间序列图时,如果x轴的日期较多,且水平排列的话,会使得在视觉上比较拥挤,不太美观。 在matplotlib中,有一种高效简单的方式是直接利用图片对象的autofmt_xdate方法,其中有一个rotation参数表示逆时针旋转的度数。假设现在图片对象为fig,则通过fig.autofmt_xdate(rotation=35),便可以让日期逆时针旋转35度的方式显示出来。 网上有些方法是利用xtick方法中的rotation参数,该方法在双y轴中会失效,但是...原创 2020-08-25 18:19:08 · 3019 阅读 · 0 评论 -
pandas读取较大文件卡死问题的一个可能原因
最近遇到一个pandas.read_csv读取一个200多兆大小的文件卡死的问题,其实该文件也不算太大,而且笔者的机器配置也不低,但是就是卡了。就算怀疑文件太大,使用chunksize分块读取返回迭代器处理也不行。 刚开始还报了一个错是文件格式不规范,导致有些行的列数过多,以为只是少数,所以设置了error_bad_lines=False,不让其报错而是直接忽略这些行。最终发现问题就是由该设置引起。最后仔细查看原始文件,发现原始文件第一行是一串文字,所以导致pandas以第一行...原创 2020-08-20 19:20:25 · 2681 阅读 · 0 评论 -
pandas DataFrame的apply函数result_type参数说明
DataFrame的apply函数是对指定的轴进行循环处理,并返回处理的结果。这里有一个问题在于,如果对于每一次运算,返回的结果只有一个元素,那么最终得到的结果是一个Series;但是如果每次处理返回的不是一个元素,而是由单个或者多个元素组成的可迭代对象,比如列表,那么最终得到的是Series还是DataFrame呢?对此,可以使用apply函数的result_type参数来指定。 result_type参数可以取'reduce','expand','broadcast'以及N...原创 2020-06-01 15:48:05 · 8158 阅读 · 0 评论 -
pandas DataFrame控制台打印输出设置浮点数小数位数
DataFrame的输出格式很多都可以通过pd.options的属性实现设置,具体可以看官方文档。本文说明如何设置在打印输出DataFRame时设置浮点数的输出格式,这里以保留几位小数为例,可以通过pd.options.display.float_format设置,将其设置为一个可以调用的以单个元素为参数的函数即可,如下所示。要注意的是,这个属性是针对浮点数的,因此对于整数int其并不起作用,可以对比下面例子中设置后的df和df1的输出结果。import pandas as pddf ...原创 2020-05-29 09:19:54 · 9260 阅读 · 1 评论 -
pandas分组聚合运算groupby之agg,apply,transform
目录一、agg和transform二、agg和apply三、其他注意点 groupby函数是pandas中用以分组的函数,可以通过指定列来进行分组,并返回一个GroupBy对象。对于GroupBy对象的聚合运算,其有经过优化的较为常用的sum,mean等函数,但是如果我们需要用自定义的函数进行聚合运算,那么就需要通过agg,apply,transform来...原创 2019-12-17 01:22:18 · 2760 阅读 · 0 评论 -
pandas、matplotlib作图之设置坐标轴标签、标题和图例标签的字体大小
import matplotlib.pyplot as pltfig,ax=plt.subplots(1,1,figsize=(9,6))ax.set_ylabel(fontsize=20) #设置y轴标签字体大小ax.set_xlabel(fontsize=20) #设置x轴标签字体大小ax.set_title(fontsize=30) #设置标题字体大小ax.legend(f...原创 2019-12-02 00:03:01 · 16121 阅读 · 0 评论 -
利用pandas的isin函数提取两个结构化数据文件的异同
在进行数据分析时,有时候我们需要对比两份数据是否一致,如果不一致,提取不一致的数据记录;对于结构化的数据来说,我们可以利用pandas的DataFrame数据结构来实现这一点。 我们先将结构化数据文件读入成DataFrame,然后再利用DataFrame的isin函数来实现。这里对于isin函数要注意的有以下几点:1、isin(values)函数中,如果value...原创 2019-11-18 13:37:56 · 697 阅读 · 4 评论 -
pandas性能百倍提升之用字典索引或ndarray替换DataFrame索引以及内存占用分析
在利用pandas进行数据分析时,DataFrame是其基本的数据结构,当数据量较小时还好,一旦数据量较大,比如几十万上百万时,这时DataFrame就会变得笨重,笨重主要体现在对其索引的操作上,而对DataFrame的索引操作又是基本的操作,所以这时,在性能上就会有很大的损失;对pandas的使用可以让我们可以直观简单的进行数据分析,但是往往会在性能上有较大的损失。当然,对于性能的...原创 2019-11-05 19:00:07 · 5215 阅读 · 0 评论 -
pandas性能提升之避免对小数据量使用pandas内置函数
pandas本身就是面向数据分析的,而且是面向大数据分析的,所以其内置函数本身在设计上相比于一些python原生的操作就会繁杂一些,这也是为了功能性的考虑。所以,这就导致了其内置函数就像高速火车,而python的原生操作就像超跑,超跑在速度上是具有优势的,但是在功能性上是比不上高速火车的。所以,理论上,如果可以用python的原生操作实现,那么总是可以更快的,毕竟内置函数很多也是用原...原创 2019-11-05 14:34:20 · 586 阅读 · 0 评论 -
pandas之apply和for loop之间的比较和权衡
首先,文章开头就需要强调的是:对于大的数据量,能不用loop就尽量不用loop,无论是for loop还是apply,尽量用内置函数实现。 在pandas里,我们经常听到一句话就是尽量减少for loop的时候,尽量用apply去替代,但是这句话是有语境的,并不一定的正确的,实际上,在pandas里,对于for loop和apply之间的使用,是一个需要权衡的东西,并...原创 2019-11-05 11:29:23 · 2194 阅读 · 0 评论 -
pandas给DataFrame新增列并赋值
给DataFrame新增列的话,除了join,merge,concat这些函数之外,还可以通过简单的df['new_column']=values的形式对其新增列,但是在使用这种方式新增列时,需要注意索引问题以及新增多列时该如何操作。一、索引问题 这个问题只有在等号右边的对象是Series或者DataFrame时需要注意,因为这时等号右边的对象是有索引的,这样赋值...原创 2019-10-31 13:14:14 · 49727 阅读 · 0 评论 -
pandas性能提升之利用chunksize参数对大数据分块处理
DataFrame是一个重量级的数据结构,当一个dataframe比较大,占据较大内存的时候,同时又需要对这个dataframe做较复杂或者复杂度非O(1)的操作时,会由于内存占用过大而导致处理速度极速下降。 对此,我们的方法是尽量避免直接对过大的dataframe直接操作(当然有时候没有办法,必须对整体的dataframe进行操作,这时就需要从其他方面优化,比如尽量...原创 2019-08-19 20:58:38 · 14596 阅读 · 3 评论 -
pandas性能提升之避免直接对大DataFrame多次索引和访问
DataFrame是一个比较重量级的数据结构,当我们对一个比较大的DataFrame进行多次重复性访问时,效率是很低的。比如,如果我们需要对一个DataFrame逐行进行一个相对复杂一点的操作,尽管可以使用相对高效的apply进行逐行遍历,但是如果我们对每行的操作需要同时用到其他行时,如果是直接对DataFrame进行操作,这时就避免不了对DataFrame进行索引操作,而实际上对D...原创 2019-08-05 11:07:17 · 679 阅读 · 0 评论 -
matplotlib: 双Y轴、同一坐标轴中不同类型图、设置坐标轴刻度格式
pandas的plot函数已经可以满足很多的基本作图需求,但是其有一个比较明显缺点是不能一次性的在同一个坐标轴中画不同类型的图,比如折线图和柱状图,而且也不能设置坐标轴刻度的格式。当然这两个需求在matplotlib中是很容易就可以实现的,毕竟pandas的plot函数也是基于matplotlib的,而且matplotlib本身相对于其他的一些画图库,其也是较为底层和功能强大的。...原创 2019-07-01 15:05:08 · 19280 阅读 · 1 评论 -
pandas中读取、写入csv文件和excel文件的若干问题
1、当读取一个文件出现UnicodeError时,可能是因为此文件的编码方式不是utf-8,因为python3默认的编码方式的utf-8,所以如果编码冲突就会出现这样的错误。解决办法是更改文件的编码方式,这个可以打开文件,然后选择‘另存为’——工具——web选项——编码方式,点击更改为utf-8即可;2、对于0开始的数字串写入和读取的问题写入:对于这种类型的数字,要注意先转为字符串格式...原创 2018-10-02 22:16:57 · 2585 阅读 · 0 评论 -
高性能Pandas:eval和query
本文转载自michael的自由空间 jianshu.com/p/caaf201fc5a8 正如我们在前面几节中已经看到的,PyData堆栈的强大功能建立在NumPy和Pandas通过直观语法将基本操作使用C实现能力之上:例如NumPy的矢量化/广播操作,Pandas的分组类型操作。尽管这些抽象概念在许多常见的...转载 2019-08-16 10:02:26 · 399 阅读 · 0 评论 -
pandas_profiling: 基于pandas的描述性统计报告生成器
最近发现了一个基于pandas的第三方库pandas_profling,其作用是基于pandas的DataFrame中的数据内容,一次性生成关于该DataFrame数据的描述性统计报告,该报告对于我们了解这个数据的基本特点和一些统计特性很有帮助,根据该报告可以让我们对该数据具有一个基本的认识和感知。本文先讲一下该报告包括了哪些内容,然后再讲一下使用方法。 该报告是htm...原创 2019-08-29 16:50:53 · 1366 阅读 · 0 评论 -
pandas中对nan空值的判断和陷阱
pandas基于numpy,所以其中的空值nan和numpy.nan是等价的。numpy中的nan并不是空对象,其实际上是numpy.float64对象,所以我们不能误认为其是空对象,从而用bool(np.nan)去判断是否为空值,这是不对的。 对于pandas中的空值,我们该如何判断,并且有哪些我们容易掉进去的陷阱,即不能用怎么样的方式去判断呢?可以判断pand......原创 2019-09-09 15:32:18 · 68231 阅读 · 10 评论 -
python数据分析性能提升之避免使用pd.Series的value_counts()
在数据分析时,当我们需要统计一个数据集中的元素的出现次数时,对于pandas中的Series对象,直接有value_counts函数,会直接返回一个以元素为索引,出现次数为值的Series,如下图所示。 问题在于,如果数据集较大,而且其中的元素也不是int或者float等简单的对象,例如是列表、元组等对象,那么利用Series的value_counts对象是非常低...原创 2019-09-27 16:54:21 · 2133 阅读 · 0 评论 -
pandas中DataFrame多条件过滤:用位运算符进行条件连接
对于df,我们可以直接用df[bool Series]进行过滤。其中一般情况下,我们是通过例如df['column']==1这种方式得到一个bool Series的,但是对于多条件的话,我们并无法通过bool运算符来连接这多个条件,比如通过df[(df['column1']==1) and (df['column2']<10)]这种方式就是不行的,会报错:ValueError:...原创 2019-09-27 17:30:47 · 4311 阅读 · 0 评论 -
pandas数据merge陷阱之对NaN值的位置处理
在利用pandas进行数据分析时,merge是很常用的操作,但是这里有一个小陷阱,就是当两个DataFrame进行merge之后,如果左侧的DataFrame出现的空值NaN,那么pandas默认会把其放置在merge后的DataFrame的末尾,这是个需要特别注意的地方。如下图所示。 特别是当我们后续要对空值填充的话,如果是用前向填充或者后向填充等和相对位置有关...原创 2019-10-09 21:44:07 · 7644 阅读 · 0 评论 -
pandas输出csv文件用Excel打开中文乱码问题
pandas的to_csv方法默认输出编码方式为uft8,但是是无BOM格式的,但是对于excel软件,其对于utf8编码方式,只支持有BOM格式的,因此直接输出csv文件使用无BOM格式的utf8编码格式的,这时用excel软件打开后会出现中文乱码问题。当然这时excel软件本身不支持无BOM的utf8编码,如果用文本编辑器或者notepad++等支持无BOM的utf8编码方式的编...原创 2019-05-31 22:22:04 · 5610 阅读 · 1 评论 -
将DataFrame的多列设为多层次索引
对于一个DataFrame,df,有时候我们需要把df的两个或多列设为这个df的层次索引,但是同时又希望保留这两列,这时要避免直接用df.index=df[['a','b']]这样的方式,因为这样赋值之后,df的index并不是一个层次索引,而是以列'a','b'组成的元组构成的单层次索引。要实现这样的多层次索引,有以下几种方式:1、df.set_index(['a','b'],...原创 2019-05-27 21:30:19 · 8566 阅读 · 0 评论 -
在DataFrame中新建列赋值后全部为NaN的问题释疑
在pandas中,有时候我们对一个df以如下方式新创建一个列,然后用一个Series赋值给新建的列,但是发现得到的新列的值全部为NaN,这是什么原因呢?df['newColumn']=df_other['otherColumn'] 注意以上赋值方式中,等号右边为一个Series,这时就需要考虑这个Series的index和df的index是否一致,如果不一致,那...原创 2019-05-20 22:00:41 · 16974 阅读 · 6 评论 -
numpy中ndarray对象和pandas中DataFrame对象的索引方法及对比
pandas库是基于numpy构建的,所以其中的数据类型具有许多的相似之处,这里我们研究ndarray和DataFrame这两种数据结构在索引方面的方法,并做一些基本的对比,以此让我们更好的记忆和理解相应的索引方法。先抛出结论:对于DataFrame对象,其只有直接的df[][]索引和ndarray不一样,此时DataFrame先索引的是列,而不是行,也没有df[i,j]的索引方法,...原创 2018-07-01 18:39:00 · 1907 阅读 · 0 评论 -
pandas中DataFrame和Series对象的排序方法的说明
pandas中的DataFrame是我们在数据分析时最常用到的一类数据结构,而在数据分析时,对数据进行排序也是经常用的一种操作,因此,本文将针对DataFrame的排序问题进行一个详细的说明。 对DataFrame对象排序可以分为对索引排序和对值排序。首先看对索引进行排序,利用DataFrame的sort_index()方法,其中有两个参数为axis和ascendin...原创 2018-07-03 13:14:09 · 7359 阅读 · 0 评论 -
pandas中DataFrame的apply()方法和applymap()方法,以及python内置函数map()
我们经常会对DataFrame对象中的某些行或列,或者对DataFrame对象中的所有元素进行某种运算或操作,我们无需利用低效笨拙的循环,DataFrame给我们分别提供了相应的直接而简单的方法,apply()和applymap()。其中apply()方法是针对某些行或列进行操作的,而applymap()方法则是针对所有元素进行操作的。 我们给出具体的例子看这两个方法...原创 2018-07-03 14:20:07 · 13039 阅读 · 0 评论 -
pandas中DataFrame的stack()、unstack()和pivot()方法的对比
pandas中,这三种方法都是用来对表格进行重排的,其中stack()是unstack()的逆操作。某种意义上,unstack()方法和pivot()方法是很像的,主要的不同在于,unstack()方法是针对索引或者标签的,即将列索引转成最内层的行索引;而pivot()方法则是针对列的值,即指定某列的值作为行索引,指定某列的值作为列索引,然后再指定哪些列作为索引对应的值。因此,总结起...原创 2018-07-04 19:55:25 · 36307 阅读 · 4 评论 -
如何用pandas读取和导入csv数据文件
我们利用python进行数据分析时,pandas中的DataFrame数据结构是最基本最常用的,因此本文将说明如何利用pandas中的方法读取csv文件中的数据,以及如何把DataFrame对象的数据导入到csv文件中储存。 关于导入数据,可以直接用DataFrame对象的to_csv方法,这个方法参数有很多,见图一。这里介绍三个重要参数:path_or_buf、mo...原创 2018-09-25 12:54:56 · 9550 阅读 · 0 评论 -
pandas中高维数据的多层次索引
在pandas中,当涉及到高维数据时,通常用多层次索引来表示。当然pandas中还有一个panel数据结构,可表示三维的数据,但是pandas官方推荐使用多层次索引,不提倡使用panel数据结构,而且panel未来也将会被pandas抛弃。下面我们来说明一下pandas中多层次索引该怎么使用。 本文以pandas中的DataFrame数据结构为例,先构造一个含有多层次...原创 2018-09-26 00:26:19 · 4402 阅读 · 0 评论 -
获取DataFrame的值的索引以及其他
1、可以用DataFrame的条件索引,即令df_sub=df[conditions],然后再获取df_sub的index属性即可2、对于某一个列,可以先转化为list类型,然后利用list.index(values)方法获取索引,其中若有重复着,则返回第一个值对应的索引3、list.count(value)可返回value在list中的个数4、DataFrame.count()返回每...原创 2018-09-30 22:47:51 · 8657 阅读 · 0 评论