Python 在pandas中将字符串/数字数据转换为分类格式

Python 在pandas中将字符串/数字数据转换为分类格式,python,pandas,dataframe,categorical-data,Python,Pandas,Dataframe,Categorical Data,我有一个非常大的csv文件,我已经将其转换为熊猫数据帧,其中包含字符串和整型/浮点值。我想将此数据更改为分类格式,以尝试节省一些内存。我的想法基于以下文档: 我的数据框如下所示: clean_data_measurements.head(20) station date prcp tobs 0 USC00519397 1/1/2010 0.08 65 1 USC00519397 1/2/2010 0.

我有一个非常大的csv文件,我已经将其转换为熊猫数据帧,其中包含字符串和整型/浮点值。我想将此数据更改为分类格式,以尝试节省一些内存。我的想法基于以下文档:

我的数据框如下所示:

    clean_data_measurements.head(20)

        station         date    prcp    tobs
    0   USC00519397 1/1/2010    0.08    65
    1   USC00519397 1/2/2010    0.00    63
    2   USC00519397 1/3/2010    0.00    74
    3   USC00519397 1/4/2010    0.00    76
    5   USC00519397 1/7/2010    0.06    70
    6   USC00519397 1/8/2010    0.00    64
    7   USC00519397 1/9/2010    0.00    68
    8   USC00519397 1/10/2010   0.00    73
    9   USC00519397 1/11/2010   0.01    64
    10  USC00519397 1/12/2010   0.00    61
    11  USC00519397 1/14/2010   0.00    66
    12  USC00519397 1/15/2010   0.00    65
    13  USC00519397 1/16/2010   0.00    68
    14  USC00519397 1/17/2010   0.00    64
    15  USC00519397 1/18/2010   0.00    72
    16  USC00519397 1/19/2010   0.00    66
    17  USC00519397 1/20/2010   0.00    66
    18  USC00519397 1/21/2010   0.00    69
    19  USC00519397 1/22/2010   0.00    67
    20  USC00519397 1/23/2010   0.00    67

这是另外2700行的降水数据。由于其属于同一类别(车站编号),因此应可转换为类别格式,以节省处理时间。我只是不确定如何编写代码。有人能帮忙吗?谢谢。

我想我们可以使用
factorize

objectdf=df.select_dtypes(include='object')

df.loc[:,objectdf.columns]=objectdf.apply(lambda x : pd.factorize(x)[0])
df
Out[452]: 
    station  date  prcp  tobs
0         0     0  0.08    65
1         0     1  0.00    63
2         0     2  0.00    74
3         0     3  0.00    76
5         0     4  0.06    70
6         0     5  0.00    64
7         0     6  0.00    68
8         0     7  0.00    73
9         0     8  0.01    64
10        0     9  0.00    61
11        0    10  0.00    66
12        0    11  0.00    65
13        0    12  0.00    68
14        0    13  0.00    64
15        0    14  0.00    72
16        0    15  0.00    66
17        0    16  0.00    66
18        0    17  0.00    69
19        0    18  0.00    67
20        0    19  0.00    67
你也可以试试这个

for y,x in zip(df.columns,df.dtypes):
    if x == 'object':
        df[y]=pd.factorize(df[y])[0]
    elif x=='int64':
        df[y]=df[y].astype(np.int8)
    else:
        df[y]=df[y].astype(np.float32)

所需的输出是什么?请问,为什么分类格式可以节省处理时间?另外,
clean\u data\u measurements[“station”]=clean\u data\u measurements[“station”]有什么问题吗?astype(“category”)
?感谢ytu提供的代码,这是一个干净的解决方案,它可以工作。一位朋友向我推荐了这个想法,显然,分类数据占用的内存更少,计算速度更快,我引用的文档支持这个想法/分类数据类型在以下情况下很有用:一个只包含几个不同值的字符串变量。将这样的字符串变量转换为分类变量将节省一些内存,请参见此处。/我正在将您的建议合并到我的较大代码中。