欢迎光临散文网 会员登陆 & 注册

Pandas源码分析(一): 核心类型DataFrame的实现

2023-02-02 19:17 作者:StepfenShawn  | 我要投稿

最近在玩数据分析需要用到Pandas处理数据, 在网上看到了各种骚操作,为了提升开发效率(避免造轮子)必须得read the fucking source code 只有读懂了源代码 ,才算是懂了原理。顺便来模仿(学习)一下大神写代码的风格。。。

DataFrame 类的定义

我们先来看一下DataFrame结构是怎么定义的:

我们写一个简单的Pandas案例并使用pbd进行调试, 看看新建一个DataFrame对象后会发生什么:

我们输入"s"进入构造函数调用:

然后一直输入"n&l"进行逐行调试并打印, 我们看到首先它会判断数据和数据类型是否为空:

之后又会根据所给的数据类型进行相应的操作,中间的代码有点多,我们先来看看data是dict时的情况:

 它会调用"dict_to_mgr"方法赋值给一个临时变量mgr, 然后用mgr初始化父类NDFrame。

那么我们来看看"dict_to_mgr"方法做了些什么, 代码的注释大概是说将序列转化为矩阵:

然后它会判断列是否为None, 我们没有声明columns, 所以进入else:

else部分会计算出keys, columns, 然后来看看keys和colums的值是多少:

此时columns是一个Index类型了, 列的索引已经计算好了,接下来到计算行的操作了!!!

调试一波后arrays的值为一个list, 它把dict的所有的value放入一个list里了:

最后返回为一个mgr类型:

这样就求出mgr了, 我们发现mgr是BlockManager的:

一个DataFrame就新建完了, 然后我们打印时又df时调用了__repr__:

我们来总结一下吧, 创建一个DataFrame时首先会检查data和columns是否为None, 然后判断所给data的类型, 然后获取data的key作为columns的索引, 然后运用key新建一个索引Index类, 最后转化为BlockFrame类型, 使用这个类可以更方便管理表格的每一个块。


Pandas的源代码是真得复杂, 不过用pdb逐行调试慢慢地揭开了这堆抽象的代码结构。。。

Pandas源码分析(一): 核心类型DataFrame的实现的评论 (共 条)

分享到微博请遵守国家法律