我有一个大熊猫数据框,我正在尝试在其上进行一些相对简单的广播:
# self.matrix: pd.DataFrame (1477949 x 173)
cultivated = ['A', 'A', 'B', 'B', 'C', 'C', 'D']
non_cultiv = ['A', 'D', 'B', 'D', 'C', 'D', 'D']
for groups in cultivated, non_cultiv:
for i, hsg in enumerate(groups):
sel = (self.matrix.hydro_group == i + 1) & (self.matrix.cultivated_cdl == 1)
self.matrix.loc[sel, 'cn_ag'] = self.matrix.loc[sel, 'cn_ag_' + hsg]
问题在于广播操作(我的代码块的最后一行)似乎正在创建副本,因为它开始分配内存。由于这已经是一个很大的数组,因此会导致我的内存最大。
如果我使用随机生成的数据重新创建此操作:
data = np.random.random((1500000, 175))
columns = ['r{}'.format(i) for i in range(175)]
df = pd.DataFrame(data=data, columns=columns)
sel = (df.r117 > 0.5) & (df.r114 < 0.4)
df.loc[sel, 'r117'] = df.loc[sel, 'r2']
然后不分配额外的内存,并且脚本的行为符合预期。是什么导致第一个脚本的行为有所不同?