Почему я получаю эту MemoryError? - PullRequest
0 голосов
/ 13 декабря 2018

Я столкнулся со странным MemoryError, и я не понимаю, почему он там.Пример кода:

# some setup
import numpy as np
import pandas as pd
import random

blah = pd.DataFrame(np.random.random((100000,2)), columns=['foo','bar'])
blah['cat'] = blah.apply(lambda x: random.choice(['A','B']), axis=1)
blah['bat'] = blah.apply(lambda x: random.choice([0,1,2,3,4,5]), axis=1)

# the relevant part:
blah['test'] = np.where(blah.cat == 'A',
    blah[['bat','foo']].groupby('bat').transform(sum),
    0)

Назначение blah['test'] таким образом дает сбой с MemoryError, , но : если я вместо этого сделаю это:

blah['temp'] = blah[['bat','foo']].groupby('bat').transform(sum)
blah['test'] = np.where(blah.cat == 'A',
    blah['temp'],
    0)

всеработает отлично.Я предполагаю, что есть кое-что о том, как np.where и .groupby() взаимодействуют, что вызывает это.

Однако, если у моего начального blah есть только столбцы 'foo', 'cat', 'bat' (поэтому нет столбца bar, который не 'Я не имею непосредственного отношения к ошибочному разделу кода) и с первым способом все в порядке, так что это меня еще больше смущает.

Что здесь происходит?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Первая часть вашего кода просто неверна.Если вы уменьшите размер фрейма данных, вы получите

ValueError: Wrong number of items passed 1000, placement implies 1

, что говорит о том, что np.where не может перебрать одностолбцовый фрейм данных, возвращаемый

blah[['bat','foo']].groupby('bat').transform(sum)

, и попытается поместитьвесь столбец для каждого элемента blah['test'], предположительно выделяя память для всей операции заранее, что вызывает MemoryError.

Изменение вашей реализации на

blah['test'] = np.where(blah.cat == 'A',
                        blah[['bat','foo']].groupby('bat')['foo'].transform(sum),
                        0)

должно помочь.

0 голосов
/ 13 декабря 2018
blah['test'] = np.where(blah['cat'] == 'A',
    blah[['bat','foo']].groupby('bat')['bat'].transform(sum),
    0)

Обратите внимание, что я добавил ['bat'] в конце groupby('bat').

Мое обоснование заключается в том, что ваш питон поражает MemoryError, потому что он пытается sum все в вашем Dataframe, так какэто не определено конкретно, что вы хотели sum

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...