我有一个包含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版本)
答案 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)
如果你想有效地建造它们,我认为你需要一些好的原材料:
坚固耐用。 尽量避免使用干草,因为数据框可能会被风吹散。
希望有所帮助