你可能不知道的10个Python Pandas的技巧和特性

第二个accessor, .dt是用于类似日期时间的数据。它在技术上属于Pandas的DatetimeIndex,如果在Series上调用,它首先转换为DatetimeIndex :

你可能不知道的10个Python Pandas的技巧和特性

第三个accessor ,.cat,只用于分类数据,你很快将在它自己的部分中看到。

4.从组件列创建DatetimeIndex

说到类似datetime的数据,如上面的daterng,可以从多个组成列创建一个Pandas DatetimeIndex,这些组成列共同构成一个日期或日期时间:

你可能不知道的10个Python Pandas的技巧和特性

最后,你可以删除旧的单个列并转换为Series:

你可能不知道的10个Python Pandas的技巧和特性

传递DataFrame的直觉是,DataFrame类似于Python字典,其中列名是键,各个列(Series)是字典值。这就是为什么pd.to_datetime(df[datecols].to_dict(orient="list"))在这种情况下也会起作用的原因。这反映了Python的datetime.datetime的构造,你可以在其中传递关键字参数,如datetime.datetime(year=2000, month=1, day=15, hour=10)。

5. 使用分类数据节省时间和空间

Pandas的一个强大特性是它的分类dtype。

即使你并不总是使用RAM中的千兆字节数据,你也可能遇到这样的情况,即直接操作大型DataFrame似乎挂起超过几秒钟。

Pandas object dtype通常是转换到类别数据的最佳候选。(object是Python str、异构数据类型或“其他”类型的容器。)字符串在内存中占用大量空间:

你可能不知道的10个Python Pandas的技巧和特性

注意我使用sys.getsizeof来显示序列中每个单独的值占用的内存。请记住,这些是Python对象,这些对象在一开始就有一些开销。(sys.getsizeof("")将返回49字节。)

还有colors.memory_usage,它总结了内存使用情况,并依赖于底层NumPy数组的.nbytes属性。不要太拘泥于这些细节:重要的是类型转换导致的相对内存使用,正如您接下来将看到的。

现在,如果我们把上面的独特颜色映射到一个占用更少空间的整数中呢?下面是一个简单的实现:

你可能不知道的10个Python Pandas的技巧和特性

注意:另一种方法是Pandas的pd.factorize(colors):

你可能不知道的10个Python Pandas的技巧和特性

无论哪种方式,都是将对象编码为枚举类型(分类变量)。

你会立刻注意到,与object dtype使用完整字符串相比,内存使用量几乎减少了一半。

在accessor一节中,我提到了.cat(分类)accessor。上面的mapper粗略的说明Pandas的Categoricaldtype内部正在发生:

“Categorical的内存使用与类别的数量加上数据的长度成正比。相反,对象dtype是数据长度的常数倍。”(来源)

在上面的colors中,每一个唯一值(类别)都有2个值的比率:

你可能不知道的10个Python Pandas的技巧和特性

结果,从转换到分类的内存节省是好的,但不是很大:

你可能不知道的10个Python Pandas的技巧和特性

但是,如果用大量的数据和很少的唯一值(考虑人口统计或字母测试分数的数据)来夸大上述比例,则所需的内存减少超过10倍:

你可能不知道的10个Python Pandas的技巧和特性

另一个好处是计算效率也得到了提升:对于分类Series,字符串操作是在.cat.categories属性上执行的,而不是在Series的每个原始元素上执行的。

换言之,操作在每一个唯一类别进行,并将结果映射回值。分类数据有一个.cat accessor ,它是一扇窗用于操作属性和方法来处理类别:

你可能不知道的10个Python Pandas的技巧和特性

事实上,您可以手动再现类似于上面的示例:

你可能不知道的10个Python Pandas的技巧和特性

为了精确地模拟早期手动输出,你需要做的是重新排序代码:

你可能不知道的10个Python Pandas的技巧和特性

注意,dType是NumPy的int8,一个8位有符号整数,可以取值为-127到128。(只需要一个字节来表示内存中的值。在内存使用方面,64位有符号ints将被过度使用。)我们的粗略示例默认情况下得到int64数据,而Pandas足够聪明,能够将分类数据向下转换到尽可能小的数字dtype。

.cat的大多数属性与查看和操作底层类别本身有关:

你可能不知道的10个Python Pandas的技巧和特性

不过,也有一些注意事项。分类数据一般不那么灵活。例如,如果插入以前没出现过的值,则需要先将此值添加到..categories容器中:

你可能不知道的10个Python Pandas的技巧和特性

如果你计划设置值或修正数据而不是派生新的计算,则Categorical类型可能不那么灵活。

未完,6-10条见本日推送第二篇文章。

英文原文:https://realpython.com/python-pandas-tricks/
译者:张新英


分享到:


相關文章: