У меня есть (7.5MM, 17) фрейм данных с 500 тыс. Уникальных предметов, которые я «разворачиваю», из-за отсутствия лучшего слова: у каждого уникального предмета может быть N ряд строк, связанных с различными чертами, которыми я являюсь агрегирование в столбцы, так что каждый уникальный элемент имеет только одну строку.
Для этого у меня есть цикл for, повторяющийся над каждым уникальным элементом в кадре данных. Он сортирует фрейм данных во временный фрейм данных, отфильтрованный только по строкам, представленным указанным уникальным элементом. Затем я применяю
df.loc[df['trait']=='xyz'].sum()
для 8 признаков, каждая из которых генерирует агрегированную переменную. Эти переменные затем добавляются во временный список (внутренний цикл), который, в свою очередь, добавляется в выходной список (внешний цикл).
В конце каждого цикла базовый фрейм данных удаляет все строки, связанные с уникальным элементом, так что при увеличении списка вывода размер хранилища базового фрейма данных уменьшается (коэффициент ~ 15).
Я ожидал, что это будет выполняться очень быстро, поскольку, насколько мне известно, манипуляции внутри цикла for являются векторизованной реализацией. Однако через час он прошел только через ~ 7000 строк. Это устанавливает ожидаемое время выполнения всего 3 дня. Я могу с этим смириться, но надеюсь на некоторое понимание более эффективного решения.
Машина, на которой я работаю, имеет 32 ГБ ОЗУ, 5 ТБ памяти. Эта программа занимает всего 5 ГБ ОЗУ. Есть ли способ использовать больше оперативной памяти, но двигаться быстрее?
Любое понимание будет высоко ценится.
редактировать -
wolst = []
cnt = 0
for i in wodf['WON'].unique().tolist():
tlst = []
wo = i
tdf = wodf.loc[wodf['WON']==i]
matsum = tdf.loc[tdf['LIT']=="M",'LIC'].sum()
labsum = tdf.loc[tdf['LIT']=="L", 'LIC'].sum()
labhrs = tdf.loc[tdf['LIT']=="L", 'Q'].sum()
tcsum = tdf.loc[tdf['LIT']=="T", 'LIC'].sum()
numtrp = tdf.loc[tdf['LIT']=="T", 'Q'].sum()
pmusum = tdf.loc[tdf['LIT']=="PM", 'LIC'].sum()
prtsum = tdf.loc[tdf['LIT']=="P", 'LIC'].sum()
stdsum = tdf.loc[tdf['LIT']=="S", 'LIC'].sum()
stdhrs = tdf.loc[tdf['LIT']=="S", 'Q'].sum()
labsum = labsum+stdsum
labhrs = labhrs+stdhrs
if labsum is None:
labsum = 0
if labhrs is None:
labhrs = 0
if matsum is None:
matsum=0
if tcsum is None:
tcsum=0
if numtrp is None:
numtrp=0
if pmusum is None:
pmusum=0
if prtsum is None:
prtsum=0
tlst.append([wo,labsum,labhrs,matsum,tcsum,numtrp,pmusum,prtsum])
wolst.append(tlst)
print(cnt)
cnt+=1
Где wodf
(7,5 мм, 17)