根据 python 中辅助列的值添加和平均一组列

Adding and averaging a set of columns depending on the value of a secondary column in python

我有一个具有以下值的数据集:

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
如果大多数标签(LabelA、LabelB 和 LabelC)为 1,则

Final_label 将为 1,反之亦然。

我想计算一个名为 "Polarity" 的列,它具有以下定义:

  1. 如果Final_label = 1,Polarity是所有"PositiveA/B/C"的平均值,其Label也为1
  2. 如果 Final_label = 0,极性是所有 "NegativeA/B/C" 标签也为 0
  3. 的平均值

例如在上面的数据集中,极性将具有以下值:

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 个标签列。

这是我对 wheremask 的处理方法:

# 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

我建议一个可以逐行应用于数据框的函数。当你使用 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)