Pandas中节约空间的小tip——Categorical类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas中节约空间的小tip——Categorical类型相关的知识,希望对你有一定的参考价值。

参考技术A categorical是Pandas中的分类类型数据,当数据只有少数几种可能取值但有大量重复字符串字段,利用categorical类型可有效节省内存,提高数据分析的效率。常见的分类如性别、职业等取值有限的类别数据。

Pandas中创建 categorical 型数据的方法很多,主要有以下三种途径。

1.由Series数据结构转换。在生成Series时传入参数 dtype="category" ,直接创建 categorical 型Series。

这样,就生成了一个名为 career 具有三种职业类型的 categorical 型Series。

2.由DataFrame数据转换。先生成DataFrame数组,再用df.astype修改指定列的数据类型为 category 。

查看生成DataFrame数组发现,数组中 career 和 sex 为分类数据,再对 career 和 sex 列进行转换。

career 列和 sex 列数据类型为分类数据。

3.由pd.Categorical()直接生成categorical型数据再转换为Series,或替换DataFrame中的指定内容。使用这种方法生成数据时,可用参数指定分类的类型及顺序。

其中,codes和categories分别为categorical型数据的编码属性和分类属性。

想要获得指定排序的分类,向ordered参数传递布尔值 True ,默认为 False 。这里的职业分类并无强度关系,不需要传递。

1.用分类节省内存

在文章的开头就提到当数据只有少数几种可能取值但有大量重复字符串字段时,字符串占据的内存就比较大,利用Categorical类型对其转换后可有效节省内存。

明显看到分类数据占的内存比Series数据占据内存更小。当然,这个过程也付出了一定的代价,代价就是数据转换的时间。

2.自定义排序

生成一个数据集,将其按评估结果排序:

输出结果直接按首字母排序,并未按评估结果好坏排序。欲得到预期的排序结果,将制定的排序结果传递给数据集。

今天就介绍到这里,Categorical的更多好用之处还在等待你的发掘!

比赛时的小tips

文件输入输出的效率问题

请看本站的另一篇博文.在那篇博文中测试了各种读入的时间效率.传送门

读入优化

inline int read()
{
    int x=0,p=1;char ch=getchar();
    while (ch<‘0‘||ch>‘9‘){if (ch==‘-‘)p=-1;ch=getchar();}
    while (ch>=‘0‘&&ch<=‘9‘){x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar();}
    return x*p;
}

数组的负数下标

定义一个数组指针在原数组的中间,对这个指针进行操作:

int a[100],*b=a+50;
b[-1]=1;//实际上也就相当于a[49]=1

内存占用过大?动态申请(非vector)

这个问题主要是针对有时候所开的空间太大,可能会导致爆空间.
这种不确定的情况下,我们就可以动态申请数组的空间.
而且这个动态申请是不同于我们平时所说的局部变量,那个是保存在栈里面,容易爆;这个动态申请使用的是堆空间,比那个不知道高到哪里去了:

int main(){
    int n;
    cin>>n;
    int *p=new int[n];
    for(int i=0;i!=n;++i)cin>>p[i];
    for(int i=0;i!=n;++i)cout<<p[i]<<" ";
    return 0;//*
}

数组的指针妙用

众所周知,数组名实际上就是指向该数组第一个元素的地址的一个指针.那么同理,&a[i]实际上也可以用a+i指代.
至于效率相差如何,尚未可知.用scanf输入的时候也就可以直接这么写:

scanf(""%d",a+i);

运算符的重载

像这样:

struct node
{
    int x,p;
    bool operator < (const node a)const{return x>a.x;}
    node(int h,int h1){x=h;p=h1;}
};
priority_queue<node>q;//小根堆,以x排序

对拍

不得不说,对拍是一种非常好用的技巧,特别是在大型的OI竞赛中.
所谓对拍,其实就是为了检验自己的算法是否正确,将自己程序的输出跟一个绝对正确的暴力程序的输出进行对比.
我们需要写一个数据生成器(暂且命名为data.exe),自己的程序(a.exe),暴力程序(b.exe),然后通过批处理脚本进行对拍.

数据生成器:

#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<windows.h>
int main()
{
    Sleep(1000);//这里要注意一个细节,我们的随机数种子是根据当前时间来取,如果两次运行间隔时间太短会导致生成的数据相近(或者根本就是一样的),因此在程序运行时先Sleep个1秒.
    freopen("a.in","w",stdout);
    int n;
    srand((int)time(0));  //调用srand()函数,以系统时间为随机种子
    n = 1 + rand()%10000;  //随机生成一个1到10000的自然数
    printf("%dn",n); // 输出随机生成的自然数
    return 0;
}

对拍文件,命名为*.bat,用任意的文本编辑器都可以进行编辑

@echo off
:start
gen.exe
type a.in
a.exe
b.exe
fc a.out b.out
if not ERRORLEVEL 1 goto :start
pause

以上是关于Pandas中节约空间的小tip——Categorical类型的主要内容,如果未能解决你的问题,请参考以下文章

渗透测试中的小tips

Pandas系列之入门篇——HDF5

12个敏捷过程的小提示Tips

比赛时的小tips

一些从网上收集来的小Tips

生活小技巧存放衣物防皱的小妙招