Pandas列dType数组

时间:2017-10-02 09:55:59

标签: python-3.x pandas dataframe

我有一些数据我在数据框中建模时遇到了问题,因此很容易使用并节省内存。从具有4列ID,日期,LID和数据以及600k行的CSV文件中读取数据。 ID,日期和LID是多层次索引,数据是600点的时间序列。

我目前对数据框的设置如下:

  ID       Date      LID       Data
00112   11-02-2014    I    [ 0, 1, ... ]
00112   11-02-2014    II   [ 1, 2, ... ]
00112   30-07-2015    I    [ 5, 7, ... ]
00112   30-07-2015    II   [ 3, 2, ... ]

我的问题是,使用这种结构,我无法限制数据列中的数组类型,我知道当数据类型不是数组时,这很容易,但比如整数。

所以我的问题是,这是一个合理的数据框结构吗?如果是这样的话,我怎样才能在读取CSV文件时将数据列的数组元素限制为int16。

下面是我可以定义的结构,其中Data列被分成600列,每列一个数据点,这样我就可以轻松地为每列定义dType。也许这是一个更好的结构?

  ID       Date      LID   0  1  2  3  4
00112   11-02-2014    I    0  1  5  6  7
00112   11-02-2014    II   2  4  5  3  4
00112   30-07-2015    I    5  7  1  1  2
00112   30-07-2015    II   3  2  8  7  1

文件的结构如下:Data

生成的代码读取CSV文件,首先将600个点数据列解析为数组,然后将600列数据帧连接到原始数据帧。

import ast
df = pd.read_csv(fp, header=None, names=names, dtype=dTypes)
df.Data = df.Data.apply(ast.literal_eval)
df = pd.concat([df.drop('Data', axis=1),pd.DataFrame(df.Data.tolist(),
                    dtype=np.int16)], axis=1)

df = df.set_index(['PatientID', 'Date', 'LeadID'])

1 个答案:

答案 0 :(得分:1)

我认为第二次听力更好,因为您可以轻松更改数据类型。例如,对于如下所示的数据框:

In [82]: df
Out[82]: 
    ID        Date LID      Data
0  112  11-02-2014   I  [ 0, 1 ]
1  112  11-02-2014  II  [ 1, 2 ]
2  112  30-07-2015   I  [ 5, 7 ]
3  112  30-07-2015  II  [ 3, 2 ]

您可以构建一个新数据框,其中Data中的数据类型为int16,如下所示:

In [94]: pd.concat([df.drop('Data', axis=1),pd.DataFrame(df.Data.tolist(),
                    dtype=np.int16)], axis=1)
Out[94]: 
    ID        Date LID  0  1
0  112  11-02-2014   I  0  1
1  112  11-02-2014  II  1  2
2  112  30-07-2015   I  5  7
3  112  30-07-2015  II  3  2

In [96]: df.dtypes
Out[96]: 
ID       int64
Date    object
LID     object
0        int16
1        int16
dtype: object

编辑:如果列Data包含"[1, 2, ...]"之类的字符串而不是列表,则需要将字符串转换回列表,如下所示:

import ast
df.Data = df.Data.apply(ast.literal_eval)
df = pd.concat([df.drop('Data', axis=1),pd.DataFrame(df.Data.tolist(),
                        dtype=np.int16)], axis=1)