Добавьте значения в группу и пересчитайте в Python

#python #pandas #numpy

Вопрос:

У меня есть набор данных, в котором я хотел бы добавить определенные значения в определенную строку и пересчитать значения других определенных строк.

Например. Для «aa» q222 я хотел бы добавить значение 500 в столбец «pwr». Затем это изменит значения «доступно» для q222 и далее.

Данные

 id date pwr used avail aa q122 1000 727.2 272.8 aa q222 1000 975.7 24.3 aa q322 1000 1092.7 -92.7 aa q422 1000 1196.7 -196.7 bb q122 1000 0 1000 bb q222 1000 117.3 882.7      

Желанный

 id date pwr used avail aa q122 1000 727.2 272.8 aa q222 1500 975.7 524.3 aa q322 1500 1092.7 407.3 aa q422 1500 1196.7 303.3 bb q122 1000 0 1000 bb q222 1100 117.3 982.7  

Логические

  1. добавлено 500 в столбец «pwr» для aa q222 и далее
  2. добавлено 100 в столбец «pwr» для bb q222 и далее

Делающий

Я думаю, что могу проиндексировать строку, но не знаю точно, как это сделать. Я все еще занимаюсь исследованиями. Любое предложение приветствуется.

 df.loc[df.index['q222], 'aa'] = 500  

Комментарии:

1. Ваши ожидаемые данные показывают только изменения в avail столбце, а не used , в то время как в вашем описании говорится и то, и другое.

2. Да, я изменил/обновил это. Следует вносить только изменения в доступные

Ответ №1:

Вот и мы:

 # row q222 onward, within `id` group mask = df['date'].eq('q222').groupby(df['id']).cumsum() gt;= 1  df.loc[mask, 'avail']  = df['id'].map({'aa':500, 'bb':100})  

Выход:

 id date pwr used avail 0 aa q122 1000 727.2 272.8 1 aa q222 1000 975.7 524.3 2 aa q322 1000 1092.7 407.3 3 aa q422 1000 1196.7 303.3 4 bb q122 1000 0.0 1000.0 5 bb q222 1000 117.3 982.7  

Примечание. Если вы date можете быть заказаны, как следует из названия, и далее отражает порядок, то mask может быть просто:

 mask = df['date'] gt;= 'q222'  

Комментарии:

1. хорошо, я вижу, вы используете словарь, я подумал, что мне тоже следует использовать его для сопоставления значений. Попробуем это сейчас

2. @Линн, я не уверен в твоей логике с pwr И. avail Но вы можете изменить/обновить pwr аналогичным образом.

3. поскольку новые значения должны быть добавлены в столбец pwr. например, значение 500 должно быть добавлено в строки начиная с q222 и далее для этой группы

4. Ах, теперь я понимаю, ваши столбцы просто pwr = used avail , вы, конечно, можете обновить один столбец used/avail , используя эту логику, после обновления другого.

5. хорошо, я сделаю это, спасибо