【问题标题】:How to get the mean value of a columns having condition which specified?如何获得具有指定条件的列的平均值?
【发布时间】:2020-04-30 07:20:15
【问题描述】:

我有一个包含列(名称,a,b)的数据框,我想创建一个列名称“mean”,这将是列 a 和 b 的平均值,但如果任何两行的平均值相同,则总和值更多应该减少0.1。

   data frame 1

  Name  Sum  a   b      mean
0 hamm   34  2   2       2
1 jam    54  1   1  -->  1
2 tan    36  3   1       2
3 pan    39  4   4       4

正如我们现在看到的那样,第 0 行和第 2 行具有相同的平均值,所以现在谁的总和值更大应该减少 0.1

在这里,在这种情况下,它的第 2 行的值应该是 2- 0.1 = 1.9

最终结果

  Name  Sum  a   b   mean
0 hamm   34  2   2    2
1 jam    54  1   1    1
2 tan    36  3   1    1.9
3 pan    39  4   4    4

【问题讨论】:

  • 您这样做是为了解决什么问题?我想不出任何数学意义的原因。
  • 这绝对是有道理的......这里的“a”和“b”列是我使用不同 ML 模型获得的功能的排名,我想取一个平均值,所以我会来要知道哪些功能排名总体不错。如果排名相同,那么我想应用这个指定的条件,所以应该出现总和更大的那个。 @KarlKnechtel
  • 如果有 3 行均值相同会怎样?
  • 那就是我想编写通用代码,以便它可以处理这样的情况。 @AlexandreB。
  • 那么总和最大的将是(平均 -0.2 ),第二个将是(平均 -0.1 ),最后一个保持不变。 @AlexandreB。

标签: python python-3.x algorithm sorting


【解决方案1】:

你可以试试meancumcount

df.assign(mean = df[["a", "b"]].mean(axis=1))\
  .assign(mean = df["mean"].subtract(df.groupby("mean").cumcount().divide(10)))

输出

#    Name  Sum  a  b  mean
# 0  hamm   34  2  2   2.0
# 1   jam   54  1  1   1.0
# 2   tan   36  3  1   1.9
# 3   pan   39  4  4   4.0

解释

  1. 使用mean 计算平均值。我们指定axis=1 在行上计算它。

  2. 对于每个相同的mean,我们要减去n*0.1

    1. 我们使用groupby 对具有相同mean 的所有行进行分组
    2. 我们使用cumcount 获取他们的电话号码。有关详细信息,请参阅此discussion
    3. 使用divide除以10,以便将计数器转换为0.1, 0.2, ...
  3. 使用subtract将第2步的输出减去mean


完整代码+插图


# Step 1
df["mean"] = df[["a", "b"]].mean(axis=1)
print(df)
#    Name  Sum  a  b  mean
# 0  hamm   34  2  2   2.0
# 1   jam   54  1  1   1.0
# 2   tan   36  3  1   2.0
# 3   pan   39  4  4   4.0

# Step 2.1 + 2.2
print(df.groupby("mean").cumcount())
# 0    0
# 1    0
# 2    1
# 3    0
# dtype: int64

# Step 2.3
print(df.groupby("mean").cumcount().divide(10))
# 0    0.0
# 1    0.0
# 2    0.1
# 3    0.0
# dtype: float64

# Step 3
df["mean"] = df["mean"].subtract(df.groupby("mean").cumcount().divide(10))
print(df)
#    Name  Sum  a  b  mean
# 0  hamm   34  2  2   2.0
# 1   jam   54  1  1   1.0
# 2   tan   36  3  1   1.9
# 3   pan   39  4  4   4.0

【讨论】:

  • 它不适用于问题陈述。例如。在这个特殊问题中,它不适用于 df.mean ..row 0 & 2。
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 2022-08-14
  • 1970-01-01
  • 2020-10-11
  • 2015-09-11
  • 1970-01-01
  • 2016-09-30
相关资源
最近更新 更多