2015-05-28 4 views
2

Предположим, что у меня есть панды Dataframe в приведенном ниже формате на основе «Словаре из Dicts» Group'list (также ниже) ...Панды DataFrame манипуляции на основе значения столбца

ITEMS={ 
    “Item_group1”:{‘Stuff’:’Some stuf’ 
      ‘More Stuff’:’Extra Stuff’ 
      Group:[[Iteration1, 18, 25,0], [Iteration1, 43, 67,1], [Iteration1, 87, 76,1], 
       [Iteration2, 45, 29,0], [Iteration2, 44, 77,1], [Iteration2, 43, 74,0]], 

      } 
    “Item_group2”:{‘Stuff’:’Some stuf’ 
      ‘More Stuff’:’Extra Stuff’ 
      Group:[[Iteration1, 75, 564,0], [Iteration1, 21, 87,1], [Iteration1, 7, 5,1], 
       [Iteration2, 54, 24,0], [Iteration2, 7, 45,1], [Iteration2, 45, 745,0]], 
      } 

DataFrame в следующем формате ....

Iteration Value1 Value2 Feature Active 
Iteration1 18  25  0 
Iteration1 3  67  1 
Iteration1 87  76  1 
Iteration2 45  29  0 
Iteration2 44  7  1 
Iteration2 43  74  0 

Как будет идти об отделении и вычисление средних значений для каждой итерации на основе «активной функцией» == 1, и игнорировать любые «функции активного» == 0 записей?

У меня есть следующий код для расчета статистики на итерацию для Value1 и Value2 после разделения на «Итерация» и «Функция Active» в качестве ключей, но в нем отображается «Feature Active» == 0, который меня не интересует ,

FeatureAvgs = Item_group1_DF.groupby(['Iteration’,’Feature Active']) 
print np.round(FeatureAvgs[['Value1','Value2']].describe(), decimals=1) 

Который производит следующий вывод ... (игнорировать фактические данные, это было взято из другого dataframe)

Iteration Feature Enabled 
Iteration1 0    count 3672.0 3672.0 
          mean -1352.5  0.0 
          std  220.5  0.0 
          min -1920.0  0.0 
          25% -1507.2  0.0 
          50% -1267.0  0.0 
          75% -1184.0  0.0 
          max  -785.0  0.0 
      1    count 580.0 580.0 
          mean -1368.6 -1394.5 
          std  151.5 157.7 
          min -1788.0 -1805.0 
          25% -1454.2 -1490.2 
          50% -1335.5 -1361.0 
          75% -1270.0 -1291.0 
          max -1045.0 -1033.0 
Iteration2 0    count 20612.0 20612.0 
          mean -1073.5  0.0 
          std  142.3  0.0 
          min -1730.0  0.0 
          25% -1088.0  0.0 
          50% -1036.0  0.0 
          75% -1005.0  0.0 
          max  -805.0  0.0 
      1    count 14718.0 14718.0 
          mean -1113.6 -1161.1 
          std  129.3 134.9 
          min -1773.0 -1818.0 
          25% -1151.0 -1214.0 
          50% -1095.0 -1122.0 
          75% -1043.0 -1075.0 
          max  -832.0 -897.0 

Но я только после средних средних для того, когда эта функция активна (== 1). Извините за длинный вопрос, но я новичок в панд, и по-прежнему получать через документацию

+2

Не можете ли вы просто сначала фильтровать df, а затем сгруппировать? 'FeatureAvgs = Item_group1_DF [item_group1_DF ['Feature Enabled'] == 1] .groupby (['Iteration', 'Feature Active']) [['Value1', 'Value2']]. Mean()' – EdChum

+0

Thanks EdChum, Я не знал, что вы можете редактировать DataFrame перед запуском запроса на нем – MikG

ответ

1

Вместо фильтрации на объекте GroupBy вы можете просто фильтровать начальный ДФ первый:

FeatureAvgs = Item_group1_DF[item_group1_DF['Feature Enabled'] == 1].groupby(['Iteration’,’Feature Active'])[['Value1','Value2']].mean() 

Также нет необходимости использовать describe, если вы просто хотите mean просто использовать mean, как в сторону вы можете получить доступ к mean столбец из результата describe с помощью:

print np.round(FeatureAvgs[['Value1','Value2']].describe()['mean'], decimals=1) 
0

Если я хорошо понял, что вы можете сделать:

> df.groupby(["Feature Active", "Iteration"]).mean().loc[1] 

      Value1 Value2 
Iteration     
Iteration1  45 71.5 
Iteration2  44  7.0 

Вам groupby первым на функцию, а второй на Переменная итерации. В каждой группе применяется функция mean(), и вы получаете группу с индексом 1, которые соответствуют группе Feature Active == 1.

С:

> df 

    Iteration Value1 Value2 Feature Active 
0 Iteration1  18  25    0 
1 Iteration1  3  67    1 
2 Iteration1  87  76    1 
3 Iteration2  45  29    0 
4 Iteration2  44  7    1 
5 Iteration2  43  74    0 


> df.groupby(["Feature Active", "Iteration"]).mean() 

          Value1 Value2 
Feature Active Iteration     
0    Iteration1  18 25.0 
       Iteration2  44 51.5 
1    Iteration1  45 71.5 
       Iteration2  44  7.0 

Скажите мне, если это не то, что вы хотели.

НТН