import pandas as pd
import numpy as np
from collections import OrderedDict
import gc
import datetime
df = pd.DataFrame(np.random.rand(10000000, 5), columns=['A', 'B', 'C', 'D', 'E'])
df['A'] = 0.25*((df['A']/0.25).astype(int))
df['B'] = 0.25*((df['B']/0.25).astype(int))
df['A']=df['A'].astype(str)
df['B']=df['B'].astype(str)
df['ix1'] = df['A']
df['ix2'] = df['B']
df['A1']=df['A'].astype('category')
df['B1']=df['B'].astype('category')
gc.collect()
Вопрос 1: групповые и применяемые функции занимают больше времени, чем dataframe.count, делая то же самое.Как мне оптимизировать здесь?
это занимает ~ 17 секунд
df.groupby(['A', 'B']).apply(genSummary)
это занимает всего 3 секунды
df.groupby(['A', 'B']).count()
Вопрос 2: Мне нужно применить пользовательские функции кгрупповые объекты.После установки мультииндекса группировка по строке медленнее, чем без индекса ...
def genSummary(group):
return pd.Series(OrderedDict([('Counts', np.count_nonzero(group['C'])),
('Sum', np.sum(group['D'])),
('Wavg', np.ma.average(group['E'], weights=group['C'])),
('Wavg', np.ma.average(group['E']*(group['C']>0.5), weights=group['C']*(group['C']>0))),
])
)
1 группировка по строке занимает ~ 8,1 секунды
df.groupby(['A', 'B']).apply(genSummary)
2 группировка по категориям занимает ~ 6,3 секунды
df.groupby(['A1', 'B1']).apply(genSummary)
df.sort_values(['ix1', 'ix2'], inplace=True)
gc.collect()
df.set_index(['ix1', 'ix2'], inplace=True)
gc.collect()
3 установка мультииндекса, группировка по строке занимает ~ 7,2 секунды
df.groupby(['A', 'B']).apply(genSummary)
4 установка мультииндекса, группировка по индексузанимает ~ 5.секунд
df.groupby(level=[0,1]).apply(genSummary)
5 установить мультииндекс, группировка по категориям занимает ~ 4,6 секунды
df.groupby(['A1', 'B1']).apply(genSummary)
df = df.reset_index()
gc.collect()
6 reset_index, группировка по категориям занимает ~ 4,9 секунд
df.groupby(['A1', 'B1']).apply(genSummary)
7reset_index, группировка по строке занимает ~ 6,2 секунды
df.groupby(['A', 'B']).apply(genSummary)