У меня есть большой фрейм данных для панд, на котором я пытаюсь сделать относительно простую трансляцию:
# 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']
тогда дополнительная память не выделяется, и сценарий ведет себя как ожидалось. Что заставило бы первый скрипт вести себя по-другому?