我有一些数据我在数据框中建模时遇到了问题,因此很容易使用并节省内存。从具有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'])
答案 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)