При добавлении столбца в фрейм данных выполняется различная операция для разных строк существующего столбца. - PullRequest
1 голос
/ 15 января 2020
FOOD_ID   SAMPLE_NO   ELEMENT1   ELEMENT2   ELEMENT3
 F110       A1          0.4        0.2        0.1
 F110       A2          0.6        0.1        0.3
 F110       B1          0.4        0.3        0.7
 F110       B2          0.5        0.6        0.9
 F110       C1          0.5        0.3        0.4
 F110       C2          0.6        0.2        0.6
 F110       C3          0.1        0.1        0.5
 F120       B1          0.4        0.2        0.2
 F120       B2          0.5        0.2        0.5
 F120       B3          0.7        0.3        0.8
 F120       B4          0.7        0.7        0.9
 F120       B5          0.2        0.9        0.1

Мои данные выглядят как выше. Я хочу добавить столбцы, которые дают среднее значение элементов 1,2,3 для идентификатора еды. если образец C доступен, то среднее значение будет просто средним значением C образца, если образец C отсутствует, среднее будет просто последним из образца B.

Для пищи f110 C образец присутствует, поэтому среднее значение будет средним по C выборке. Для пищи f120 C образец отсутствует, поэтому среднее значение будет последним из образца B, B5.

Фрейм данных, который я, наконец, хочу, выглядит следующим образом ...

FOOD_ID   ELEMENT1_AVG          ELEMENT2_AVG       ELEMENT3_AVG
F110     (0.5+0.6+0.1)/3=0.4  (0.3+0.2+0.1)=0.2  (0.4+0.6+0.5)=0.5
F120         0.2                    0.9               0.1

Нужна помощь. Заранее спасибо.

1 Ответ

0 голосов
/ 15 января 2020

Вы можете получить маску строк с C на Series.str.startswith, для последнего B первого теста, если не существует C для группы с GroupBy.transform и GroupBy.any до m и инвертирование маски по ~, цепочка с b и фильтрация по df[(~m & b)], а затем получить последний B по Series.duplicated с инвертированием ~.

Затем отфильтруйте оригинал DataFrame с c с Series.combine_first и агрегатом mean, потому что B - это только одна строка на группы, которые она возвращает те же значения:

c = df['SAMPLE_NO'].str.startswith('C')
b = df['SAMPLE_NO'].str.startswith('B')
m = c.groupby(df['FOOD_ID']).transform('any')

mask = ~df[(~m & b)].duplicated(subset=['FOOD_ID'], keep='last')
df1 = (df[mask.combine_first(c)]
              .groupby('FOOD_ID')
              .mean()
              .add_suffix('_AVG')
              .reset_index())
print (df1)
  FOOD_ID  ELEMENT1_AVG  ELEMENT2_AVG  ELEMENT3_AVG
0    F110           0.4           0.2           0.5
1    F120           0.2           0.9           0.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...