如何基于Pandas数据框中其他多个列的值添加两个新列?

时间:2020-05-20 22:43:14

标签: python pandas dataframe

我试图根据其他几列的值将两列添加到现有数据框中。我的数据框如下所示:

df = pd.DataFrame({'Type':['A', 'A', 'A', 'B','',''], 'Type1':['A', 'A', '', 'B','',''], 'Type2':['A','B','B','B','A',''], 'Score':[1, 2, 3, 1, 0 ,0], 'Score1':[2, 1, 0, 1, 0 ,0], 'Score2':[1, 3, 2, 1, 2 ,0]})

  Type  Type1   Type2   Score   Score1  Score2
0   A     A       A        1       2      1
1   A     A       B        2       1      3
2   A             B        3       0      2
3   B     B       B        1       1      1
4                 A        0       0      2
5                          0       0      0

我想添加两列“ Score_A”和“ Score_B”,以使“ Score_A”成为得分的平均值 对于Type为“ A”的情况(每行)。对于“ Score_B”也是如此。值得一提的是,无论类型为空,都不应使用分数来计算平均值。

在这种情况下,成功执行函数的结果将是:

Score_A  Score_B
  1.33      0 
  1.5       3
   3        2
   0        1
   2        0
   0        0

我已经在行级别运行了嵌套循环,但是有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

m1 = (df[['Type', 'Type1', 'Type2']] == 'A')
m2 = (df[['Type', 'Type1', 'Type2']] == 'B')
scores = df[['Score', 'Score1', 'Score2']]

df['Score_A'] = pd.DataFrame(np.where(m1, scores, np.nan)).mean(skipna=True, axis=1).fillna(0)
df['Score_B'] = pd.DataFrame(np.where(m2, scores, np.nan)).mean(skipna=True, axis=1).fillna(0)

print(df)

打印:

  Type Type1 Type2  Score  Score1  Score2   Score_A  Score_B
0    A     A     A      1       2       1  1.333333      0.0
1    A     A     B      2       1       3  1.500000      3.0
2    A           B      3       0       2  3.000000      2.0
3    B     B     B      1       1       1  0.000000      1.0
4                A      0       0       2  2.000000      0.0
5                       0       0       0  0.000000      0.0