Есть ли у pandas iterrows проблемы с производительностью? ⇐ Python
-
Anonymous
Есть ли у pandas iterrows проблемы с производительностью?
Я заметил очень низкую производительность при использовании iterrows из pandas.
Специально ли это для iterrows и следует ли избегать этой функции для данных определенного размера (я работаю с 2–3 миллионами строк)?
Это обсуждение на GitHub заставило меня поверить, что это происходит при смешивании типов dtypes в кадре данных, однако простой пример ниже показывает, что это происходит даже при использовании одного dtype (float64). На моей машине это занимает 36 секунд:
импортировать панд как pd импортировать numpy как np время импорта s1 = np.random.randn(2000000) s2 = np.random.randn(2000000) dfa = pd.DataFrame({'s1': s1, 's2': s2}) начало = время.время() я = 0 для rowindex, строка в dfa.iterrows(): я+=1 конец = время.время() конец печати - начало Почему векторизованные операции, например, применяются намного быстрее? Я полагаю, что там тоже должна происходить какая-то итерация по строкам.
Я не могу понять, как не использовать iterrows в моем случае (приберегу это для будущего вопроса). Поэтому я был бы признателен, если бы вам удалось избежать этой итерации. Я провожу вычисления на основе данных в отдельных кадрах данных.
Упрощенная версия того, что я хочу запустить:
импортировать панд как pd импортировать numpy как np #%% Создать исходные таблицы t1 = {'буква':['a','b'], 'номер1':[50,-10]} t2 = {'буква':['a','a','b','b'], 'номер2':[0.2,0.5,0.1,0.4]} таблица1 = pd.DataFrame(t1) таблица2 = pd.DataFrame(t2) #%% Создать тело новой таблицы table3 = pd.DataFrame(np.nan, columns=['letter','number2'], index=[0]) #%% Итерация по фильтрации соответствующих данных, оптимизации и возврату информации. для row_index, строка в table1.iterrows(): t2info = table2[table2.letter == row['letter']].reset_index() table3.ix[row_index,] = оптимизировать(t2info,row['number1']) #%% Определить оптимизацию защита оптимизации (t2info, t1info): расчет = [] для индекса r в t2info.iterrows(): вычисление.append(r['number2']*t1info) maxrow = расчет.индекс(макс(расчет)) вернуть t2info.ix[maxrow]
Я заметил очень низкую производительность при использовании iterrows из pandas.
Специально ли это для iterrows и следует ли избегать этой функции для данных определенного размера (я работаю с 2–3 миллионами строк)?
Это обсуждение на GitHub заставило меня поверить, что это происходит при смешивании типов dtypes в кадре данных, однако простой пример ниже показывает, что это происходит даже при использовании одного dtype (float64). На моей машине это занимает 36 секунд:
импортировать панд как pd импортировать numpy как np время импорта s1 = np.random.randn(2000000) s2 = np.random.randn(2000000) dfa = pd.DataFrame({'s1': s1, 's2': s2}) начало = время.время() я = 0 для rowindex, строка в dfa.iterrows(): я+=1 конец = время.время() конец печати - начало Почему векторизованные операции, например, применяются намного быстрее? Я полагаю, что там тоже должна происходить какая-то итерация по строкам.
Я не могу понять, как не использовать iterrows в моем случае (приберегу это для будущего вопроса). Поэтому я был бы признателен, если бы вам удалось избежать этой итерации. Я провожу вычисления на основе данных в отдельных кадрах данных.
Упрощенная версия того, что я хочу запустить:
импортировать панд как pd импортировать numpy как np #%% Создать исходные таблицы t1 = {'буква':['a','b'], 'номер1':[50,-10]} t2 = {'буква':['a','a','b','b'], 'номер2':[0.2,0.5,0.1,0.4]} таблица1 = pd.DataFrame(t1) таблица2 = pd.DataFrame(t2) #%% Создать тело новой таблицы table3 = pd.DataFrame(np.nan, columns=['letter','number2'], index=[0]) #%% Итерация по фильтрации соответствующих данных, оптимизации и возврату информации. для row_index, строка в table1.iterrows(): t2info = table2[table2.letter == row['letter']].reset_index() table3.ix[row_index,] = оптимизировать(t2info,row['number1']) #%% Определить оптимизацию защита оптимизации (t2info, t1info): расчет = [] для индекса r в t2info.iterrows(): вычисление.append(r['number2']*t1info) maxrow = расчет.индекс(макс(расчет)) вернуть t2info.ix[maxrow]