【发布时间】:2022-01-11 19:32:13
【问题描述】:
假设我有以下数据框:
| Product | Month 1 | Month 2 | Month 3 | Month 4 | Total |
|---|---|---|---|---|---|
| Stuff A | 5 | 0 | 3 | 3 | 11 |
| Stuff B | 10 | 11 | 4 | 8 | 33 |
| Stuff C | 0 | 0 | 23 | 30 | 53 |
可以通过以下方式构造:
df = pd.DataFrame({'Product': ['Stuff A', 'Stuff B', 'Stuff C'],
'Month 1': [5, 10, 0],
'Month 2': [0, 11, 0],
'Month 3': [3, 4, 23],
'Month 4': [3, 8, 30],
'Total': [11, 33, 53]})
此数据框显示每个产品每月的销售量。
现在,我要做的是创建一个名为“平均”的新列,用于计算每月销售的平均单位数。但是,请注意,在此示例中,Stuff C 在第 1 个月和第 2 个月的值为 0。该产品可能是在第 3 个月推出的,因此应仅根据第 3 个月和第 4 个月计算其平均值。另请注意,Stuff A 在第 2 个月的销量为 0,但这并不意味着该产品是在第 3 个月推出的,因为在第 1 个月售出了 5 台。也就是说,它的平均值应基于所有四个月计算。假设提供的数据框可能包含任意月数。
基于这些条件,我想出了下面的伪代码解决方案:
months = ["list of index names of months to calculate"]
x = len(months)
if df["Month 1"] != 0:
df["Average"] = df["Total"] / x
elif df["Month 2"] != 0:
df["Average"] = df["Total"] / x - 1
...
elif df["Month " + str(x)] != 0:
df["Average"] = df["Total"] / 1
else:
df["Average"] = 0
这样,平均值将从销售量不为 0 的第一个月开始计算。但是,我无法将这种逻辑抽象转换为实际的工作代码。我无法在保持 elif 条件的同时迭代 len(months)。或者也许有更好、更实用的方法。
我将不胜感激,因为我已经尝试解决这个问题一段时间但没有成功。
【问题讨论】:
-
也许您应该使用
0以外的其他名称,例如nan或NA来表示没有数据并完全避免复杂化。见:Working with missing data -
@Mark 但是 Stuff A 的平均值将不正确,因为它的平均值将通过忽略第 2 个月来计算...
-
不,你会在那里使用
0,因为它代表实际数字0。NA的要点是您需要一种方法来指示缺失值。 Stuff A 中的0不是缺失值,它实际上是零。 -
@Mark 不幸的是,我得到的数据不能区分 0 和 NaN。都是零。要么我把它们都变成 NaN(这对我不起作用),要么我想出一种方法来区分它们。
标签: python pandas dataframe loops