Добавление и усреднение набора столбцов в зависимости от значения дополнительного столбца в python - PullRequest
1 голос
/ 02 апреля 2020

У меня есть набор данных, который имеет следующие значения:

LabelA    PositiveA     NegativeA    LabelB    PositiveB     NegativeB    LabelC    PositiveC  NegativeC  Final_Label
  1          .60           .40         0          .30           .70         1          .9          .1         1
  0          .1            .9          0          .49           .51         0          .3          .7         0
  0          .34           .66         1          .87           .13         1          .90         .1         1

Final_label будет 1, если большинство Labels (LabelA, LabelB и Label C) будет 1 и наоборот.

Я хочу вычислить столбец под названием «Полярность», который имеет следующее определение:

  1. Если Final_label = 1, полярность является средним значением всех «PositiveA / B / C» чья метка была также 1
  2. Если Final_label = 0, полярность - это среднее значение всех "NegativeA / B / C", чья метка также была 0

Например, в Приведенный выше набор данных будет иметь следующее значение:

Polarity
.75           (adding and taking average of PositiveA and PositiveC)
.7033         (adding and taking average of NegativeA and Negativeb and NegativeC)
.885          (adding and taking average of PositiveB and PositiveC)

Как мне реализовать это в python? Здесь я показал 3 столбца, в моем наборе данных 7 столбцов Label.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Вот мой подход с where и mask:

# filter the labels, positives, negatives:
labels = df.filter(regex='Label\w').eq(1).values
positives = df.filter(regex='Positive\w')
negatives = df.filter(regex='Negative\w')

# output
df['Polarity'] = np.where(df['Final_Label'], 
                          positives.where(labels).mean(axis=1), 
                          negatives.mask(labels).mean(axis=1)
                         )

print(df['Polarity'])

Вывод:

0    0.750000
1    0.703333
2    0.885000
Name: Polarity, dtype: float64
1 голос
/ 02 апреля 2020

Я предлагаю функцию, которую можно применять к кадрам данных построчно. Когда вы используете опцию axis=1, x - это строка информационного кадра, где значения столбцов могут быть получены с использованием имени столбца:

def polar(x):
    if x['Final_Label'] == 1:
        return (x['PositiveA'] + x['PositiveB'] + x['PositiveC'])/3
    elif x['Final_Label'] == 0:
        return (x['NegativeA'] + x['NegativeB'] + x['NegativeC'])/3
    else:
        raise ValueError("Final_Label invalid")
df['Polarity'] = df.apply(polar,axis = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...