Pandas Dataframes:如何有效地构建它们

时间:2017-01-30 14:38:56

标签: python performance pandas numpy

我有一个包含1M行的文件,我试图读入20个DataFrame。我事先不知道哪一行属于哪个DataFrame或每个DataFrame有多大。如何有效地将此文件处理为DataFrame?我尝试过几种不同的方式。这是我现在拥有的:

data = pd.read_csv(r'train.data', sep=" ", header = None) # Not slow
def collectData(row):
    id = row[0]
    df = dictionary[id] # Row content determines which dataframe this row belongs to
    next = len(df.index)
    df.loc[next] = row
data.apply(collectData, axis=1)

这很慢。我究竟做错了什么?如果我只应用一个空函数,我的代码将在30秒内运行。实际功能需要至少10分钟,我不确定它是否会完成。

以下是数据集中的一些示例行:

1 1 4
1 2 2
1 3 10
1 4 4

完整数据集可用here(如果您点击Matlab版本)

3 个答案:

答案 0 :(得分:2)

因为,完整的数据集很容易加载到内存中,所以下面的内容应该很快

data_split = {i: data[data[0] == i] for i in range(1, 21)}
# to access each dataframe, do a dictionary lookup, i.e.
data_split[2].head()
     0   1  2
769  2  12  4
770  2  16  2
771  2  23  4
772  2  27  2
773  2  29  6

当您将数据帧切割成较小的数据帧时,您可能还需要重置索引或复制数据帧。

补充阅读:

答案 1 :(得分:2)

您的方法不是向量方法,因为您逐行应用python函数。

而是创建20个数据帧,为每个键[0]创建一个包含索引(在范围(20)中)的字典。然后将此信息添加到您的DataFrame:

 data['dict']=data[0].map(dictionary)

然后重新组织:

 data2=data.reset_index().set_index(['dict','index'])

data2就像:

            0  1   2
dict index          
12   0      1  1   4
     1      1  2   2
     2      1  3  10
     3      1  4   4 
     4      1  5   2
     ....

data2.loc[i]是您想要的Dataframe之一。

修改

似乎字典在train.label中描述。

您可以通过以下方式设置字典:

with open(r'train.label') as f: u=f.readlines()
v=[int(x) for x in u] # len(v) = 11269 = data[0].max()
dictionary=dict(zip(range(1,len(v)+1),v))

答案 2 :(得分:-3)

如果你想有效地建造它们,我认为你需要一些好的原材料:

  • 水泥

坚固耐用。 尽量避免使用干草,因为数据框可能会被风吹散。

希望有所帮助