首页 > 解决方案 > Python 中的 Excel AVERAGEIF 使用替代表格布局

问题描述

我有以下列表:

属性列在第一行,虚拟变量检查某种糖果类型是否符合此标准。最后一列显示每行某糖果类型的“成功值”

我想创建一个条形图,描述每个属性的平均 winpercent 值(即巧克力、果味......)。在 Excel 中,我将创建另一个表作为基础,每个属性位于顶部,平均值位于其下方(使用 AVERAGEIF 公式)。但是,我不确定如何使用 Python 来实现这一点。有人可以帮忙吗?

标签: pythongraphaverage

解决方案


如果没有 AVERAGEIF,您可以对产品attributeIsUsed * winpercent求和,并对attributeIsUsed值求和,平均值是两者的比率。

attributeIsUsed,我的意思是01如果该属性用于该糖果中,则在单元格中。

excel中的代码

如果C是 列caramelLwinpercent,您可以在单元格 C14 到 C16 中添加这些公式,平均值将在 C16 中:

C14 = SUMPRODUCT(C2:C13, L2:L13)
C15 = SUM(C2:C13)
C16 = C14 / C15

python中的代码

>>> d = [
... ['chocolate', 'caramel', 'bar', 'winpercent'],
... [1,            1,        0,     66.97],
... [1,            0,        1,     67.60],
... [0,            0,        0,     32.26],
... [1,            0,        1,     50.34],
... [1,            1,        1,     56.91]]
>>> averages = [sum(d[row][col] * d[row][-1] for row in range(1,len(d)))/sum(d[row][col] for row in range(1,len(d)))  for col in range(len(d[0])-1)]
>>> averages
[60.455, 61.94, 58.28333333333333]

例子

焦糖的平均值是: (1 * 66.97 + 1* 56.91) / (1 + 1). 您不需要条件语句来获得该公式,因为将零添加到总和是可以的!焦糖的平均值是: (1 * 66.97 + 0 * 67.60 + 0 * 32.26 + 0 * 50.34 + 1* 56.91) / (1 + 0 + 0 + 0 + 1) 分子是:

sum(d[row][col] * d[row][-1] for row in range(1,len(d)))

这里d[row][col]是 0 或 1,d[row][-1]是对应的 winpercent。

分母是:

sum(d[row][col] for row in range(1,len(d)))

这只是零和一的总和。

如果您使用的是 pandas 或类似的东西,您当然可以通过替换 和 来使这段for col in range(len(d[0])-1)代码for col in ['chocolate', 'caramel', 'bar']更具[-1]可读性['winpercent']


推荐阅读