2013-10-13 4 views
4

У меня есть большой набор данных около 200 тыс. Выборок. каждый образец имеет набор признаков (около 10) из множества около 100 тыс. возможных возможностей и несколько измерений с плавающим типом.Эффективное уменьшение функции в кадре данных pandas

Например, для данных набора данных

Features     trial    observations 
{1, 40020, 8222}   4     2 
{1, 40020, 22, 16000}  14    8 
{1, 20, 22, 1000}   1     0 
{42, 22, 16000}   2     1 

Так мне нужна функция Р таким образом, чтобы:

f(data, {1, 40020})= 

Features     trial    observations 
{1, 40020}    18    10 
{1}      1     0 
{}      2     1 

f(data, {22, 40020})= 

Features     trial    observations 
{40020}     4     2 
{40020, 22}    14    8 
{22}      3     1 

Таким образом, функция Р группирует данные по пересекающую столбец функций с дать набор и суммировать агрегированные столбцы.

Считайте, что мне нужно называть «f» для одного набора данных с множеством различных наборов функций в качестве второго аргумента, поэтому любая предварительная обработка, которую можно сделать один раз для ускорения каждого вызова, вероятно, будет полезна.

Самый быстрый способ я нашел

pandas.DataFrame([sample.data for sample in samples], index = [sample.features for sample in samples]).groupby(lambda x: x & test_features, sort = False).sum()

Но производительность была недостаточно хороша. Я предполагаю, что это потому, что я использую функцию для groupby. есть ли способ оптимизировать это?

+0

PLS опубликовать более полный пример что вы делаете, а также версию панды. – Jeff

+0

Я изменил пример, чтобы быть более явным, пожалуйста, скажите мне, ясно ли это сейчас. – idanzalz

+0

попробуйте выбрать, прежде чем группировать, что-то вроде этого: '' df.loc [:, df ['features']. Isin (set_of_features)]. Groupby (df ['Features']). Sum() ''; должно быть намного быстрее – Jeff

ответ

1

Вы можете попытаться подготовить свои данные для группировки с frozenset вместо set, так как frozenset ishable.

Сначала конвертировать Features столбец из set к frozenset:

df['Features'] = df['Features'].apply(frozenset) 

Тогда это дает пересечение вам нужно сгруппировать ваши данные:

df['Features'] & frozenset({1, 40020}) 
Out[64]: 
0 (1, 40020) 
1 (1, 40020) 
2   (1) 
3   () 

В конце концов вы получите свой результат dataframe:

df.groupby(df['Features'] & frozenset({1, 40020}), sort=False).sum() 
Out[65]: 
      trial observations 
Features      
(1, 40020)  18   10 
(1)    1    0 
()    2    1 
+0

Спасибо, что на самом деле хорошее улучшение производительности. Интересно, есть ли способ ускорить этот процесс еще больше, выполнив предварительную обработку короля на столе. – idanzalz

+0

Если длина объединения всех множеств мала, вы можете создать логический столбец для каждого значения и использовать эти столбцы для фильтрации – Boud

+0

Так как общее количество элементов в наборах составляет около 100 тыс., Этот метод не работает для меня. Я надеялся, что, возможно, для этого есть более редкая реализация. – idanzalz

Смежные вопросы