2017-02-07 6 views
3

Пример подмножество Df:Новая колонка в расчете на 1 состояния с использованием индекса и один столбец GroupBy

   Category Weight Test 
1/21/2017  SuperMarket 0.02 Nan 
1/21/2017  SuperMarket 0.18 Nan 
1/21/2017  SuperMarket 0.71 Nan 
1/21/2017  Hotel  0.53 Nan 
1/21/2017  Hotel  0.93 0.93 
1/21/2017  Hotel  0.97 Nan 
1/21/2017  Bar   0.13 Nan 
1/21/2017  Bar   0.31 Nan 
1/21/2017  Bar   0.96 Nan 
1/21/2017  Bar   0.65 0.65 
1/21/2017  Bar   0.27 0.27 
1/21/2017  Bar   0.24 Nan 
1/21/2017  Hospital 0.65 0.65 
1/21/2017  Hospital 0.90 0.90 
1/21/2017  Hospital 1.00 1.00 

Новая колонка df['Adjusted_weight'], которые будут присвоены значения на основе 3 условий:

  1. Если на любую дату и категория df['Test'] содержит только Nans, то df['Adjusted_weight'] = df['weight']
  2. Если для любой даты и категории df['Test'] содержит только значения (без Nans), то df['Adjusted_weight'] = df['weight']
  3. Наконец, если для любой даты и категории, если df['Test'] содержит оба значения и Nans, то:

я) для того, где df['Test'] = Nan, затем df['Adjusted_weight'] = df['weight'] * 0.5

II) Для где df['Test'] = value, затем df['Adjusted_weight'] = df['weight'] + SUM (df['weight'] - df['adjusted_weight'])/ number of non Nan values номер не-Nans есть * для NaNs.

В части ii) мы увеличиваем скорректированные веса, где имеются значения, так что сумма скорректированного веса (в части 3) равна сумме весов (для конкретной даты и категории).

Пример вывода:

   Category Weight Test Adjusted Weight 
1/21/2017  SuperMarket 0.02 Nan  0.02 
1/21/2017  SuperMarket 0.18 Nan  0.18 
1/21/2017  SuperMarket 0.71 Nan  0.71 
1/21/2017  Hotel  0.53 Nan  0.265 
1/21/2017  Hotel  0.93 0.93  1.68 
1/21/2017  Hotel  0.97 Nan  0.485 
1/21/2017  Bar   0.13 Nan  0.07 
1/21/2017  Bar   0.31 Nan  0.16 
1/21/2017  Bar   0.96 Nan  0.48 
1/21/2017  Bar   0.65 0.65  1.06 
1/21/2017  Bar   0.27 0.27  0.68 
1/21/2017  Bar   0.24 Nan  0.12 
1/21/2017  Hospital 0.65 0.65  0.65 
1/21/2017  Hospital 0.90 0.90  0.90 
1/21/2017  Hospital 1.00 1.00  1.00 

Пример того, как я заселена отель для 1/21/2007. Там, где есть 2 Nans и 1 значение. Так что для 2 Nans, в скорректированном весе, это было всего лишь df['weight'] * 0.5.

Теперь, где было одно значение, это просто 0.93 + (0.53 - 0.265) + (0.97 - 0.485) который = 1.68.

РАЗ ДОБАВЛЕНО РАЗДЕЛ

Для примера Bar, Есть 4 значения Nan, которые df['Adjusted weight'] = 0.5* df['weight']. Теперь для 1/21/2017 Bar есть два значения. Оба они нуждаются в весах для добавления в df ['adjust_weight'], чтобы сумма была равна df ['weight'] для 1/21/2017 Bar. Поэтому расчет равен (0,13-0,07) + (0,31-0,16) + (0,96-0,48) + (0,24-0,12) = 0,82, так как есть два значения для распределения до 0,41, будет добавлено 0,65 и 0,27, что равно 1,06 и 0,68.

У нас может быть любое количество Nans и значений, или только Nans и только значения.

Основная цель заключается в масштабировании в пределах даты и категории, где есть значения, и для обеспечения того, чтобы вес в этом поле (дата, категория) был таким же, как и раньше.

У меня много дат, и данные намного больше, чем отображаются. Благодарю.

ответ

1

Вы можете определить функцию, которую вы передаете apply после группировки, чтобы выполнить все ваши вычисления.

def f(x): 
    count = x.Test.count() 
    size = x.Test.size 
    if count == 0 or count == size: 
     return x.Weight 
    else: 
     adj_null = x.Weight * x.Test.isnull() * .5 
     notnull = x.Test.notnull() 
     distribute = adj_null.sum()/notnull.sum() 
     adj_notnull = (x.Weight + distribute) * notnull 
     return adj_null + adj_notnull 

df['Adjusted Weight'] = df.groupby([pd.TimeGrouper('D'), 'Category'], sort=False).apply(f).values 

       Category Weight Test Adjusted Weight 
2017-01-21 SuperMarket 0.02 NaN   0.020 
2017-01-21 SuperMarket 0.18 NaN   0.180 
2017-01-21 SuperMarket 0.71 NaN   0.710 
2017-01-21  Hotel 0.53 NaN   0.265 
2017-01-21  Hotel 0.93 0.93   1.680 
2017-01-21  Hotel 0.97 NaN   0.485 
2017-01-21   Bar 0.13 NaN   0.065 
2017-01-21   Bar 0.31 NaN   0.155 
2017-01-21   Bar 0.96 NaN   0.480 
2017-01-21   Bar 0.65 0.65   1.060 
2017-01-21   Bar 0.27 0.27   0.680 
2017-01-21   Bar 0.24 NaN   0.120 
2017-01-21  Hospital 0.65 0.65   0.650 
2017-01-21  Hospital 0.90 0.90   0.900 
2017-01-21  Hospital 1.00 1.00   1.000 
+0

Это категория groupby только?Существует несколько дат (требуется дата и категория данных groypby) – MysterioProgrammer91

+0

Вы можете добавить 'pd.TimeGrouper' для группировки по дате в индексе. Кроме того, я думаю, что ваш расчет для категории Bar отключен для значений, отличных от na. –

+0

Нет значений, я добавил к вопросу, как я рассчитываю пример для Bar для 1/21/2017. По сути, вы переносите вес в любом месте, где есть значение в тесте для конкретной даты и категории. – MysterioProgrammer91

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

  • Нет связанных вопросов^_^