【发布时间】:2014-08-11 16:26:38
【问题描述】:
在 Pandas 中使用 read_csv, 我已经导入了一个超过 500K 行的庞大数据集,每一行都包含一个分类代码,其中包含来自特定日期和站点的位置和丰度值。随着时间的推移,这些值会针对不同的站点重复。我无法创建唯一的时间戳,因为没有记录时间,因此我只有日期。
我的栏目是:邮轮名称、站号、纬度、经度、日期(YY/MM/DD)、分类代码、丰度
我需要重新排列数据,以便我的列将是单独的分类代码 (n>400) 作为列名,并以丰度作为这些列的值,并且行将出现具有由位置和日期组成的唯一索引信息。更复杂的是,我需要在没有观察到这些特定样本的分类代码的情况下包含零
编辑:我创建了一个具有唯一标识符的新数据框,其中包括单个列中的所有相关位置信息、丰度和分类 ID,使用:df['ID'] = df[['timestamp','cruise','station','lat','long','depth']].apply(lambda x: ','.join(map(str, x)), axis=1)
@ 987654322@
ID oldtxc zoodns100
0 1977-02-13 00:00:00,MM7701,2,41.1833,-70.6667,... 101 114.95
1 1977-02-13 00:00:00,MM7701,2,41.1833,-70.6667,... 102 40118.18
使用 numpy unique 定义变量和计数:species = df3['TaxonomicCode']cruise=df3['ID']taxa=np.unique(species) #419locats = np.unique(cruise) #27530
然后我创建了另一个用零填充的数据框:aa=pd.DataFrame(index=locats, columns=taxa) #create empty matrixaa=aa.fillna(0) #fill NaN with 0
2 100 101 102 103 104 105 106 107 108 ... 4500 4504 4601 4604 4700 5000 5100 5101 5150 9114
1977-02-13 00:00:00,MM7701,2,41.1833,-70.6667,33.0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
现在我想循环遍历原始数据以填充“aa”的值?
for d in range(len(df3)):
loc1 = df3.ID[d]
tax1 = df3.oldtxc[d]
locIndex = np.where(locats == loc1)[0][0]
taxIndex = np.where(taxa == tax1)[0][0]
aa[locIndex, taxIndex] = df3.zoodns100[d]
这最初有效并给出了预期的输出,但仅在大约 1000 次迭代后使我的计算机崩溃(剩下 509K 次迭代...... gulp。)我正在使用 iPython notebook 和/或 spyder,结果是相同的。这可能是内存问题吗?
最终我需要将生成的数据帧“aa”打印到 CSV 文件中,有没有办法在迭代期间执行此操作以清除内存?
编辑 2
现在我看到我的循环导致列垂直连接到我的数据框“aa”上,这可以解释崩溃的原因。我正在尝试做的是从 510K 行长并包含丰度值的数据帧 ('df3') 中的单个列中填充 'aa' 的值(最终应该是 419 行 x 27530 列)对于每个位置的每个观察到的物种。对于“aa”的每一行,我需要将每个位置的所有丰度数据匹配到我各自的“aa”列中。 'aa' 的每一行都是一个唯一的位置索引,使用 'np.unique' 在 'df3' 510K -> 27K 唯一站的位置值上创建。
我正在尝试遍历长度“df3”并尝试在“df3”中找到匹配的位置索引(行),并将与这些索引关联的丰度数据与“aa”中相应的单行配对
(一清二楚对吧?这很难解释……)
我确定这是我的语法,但我想将值分配给数据框 'aa'
aa[row, column] = value
这似乎导致连接,而不是分配值。我在这里错过了什么?
【问题讨论】: