熊猫在最高 x 列中的平均值

Posted

技术标签:

【中文标题】熊猫在最高 x 列中的平均值【英文标题】:Pandas mean across highest x columns 【发布时间】:2021-12-23 22:37:49 【问题描述】:

我希望能够计算4周列的平均值,但是如果Top x列中的数字小于4,我只想使用最大x值来计算平均值(即如果Top x = 3、计算均值时舍弃最低周值。

示例数据框:

df = pd.DataFrame('week 1' : [1.0, 5.0, 7.0, 6.0, np.nan],
               'week 2' : [3.0, np.nan, 9.0, 8.0, np.nan],
               'week 3' : [1.0, 2.0, 2.0, 1.0, 6.0],
               'week 4' : [np.nan, 4.0, 2.0, 7.0, 6.0],
               'Top x' : [3.0, 2.0, 4.0, 3.0, 3.0])

     week 1  week 2  week 3  week 4  Top x
0     1.0     3.0     1.0     NaN    3.0
1     5.0     NaN     2.0     4.0    2.0
2     7.0     9.0     2.0     2.0    4.0
3     6.0     8.0     1.0     7.0    3.0
4     NaN     NaN     6.0     6.0    3.0

预期输出:

     week 1  week 2  week 3  week 4  Top x   Mean
0     1.0     3.0     1.0     NaN    3.0  1.666667
1     5.0     NaN     2.0     4.0    2.0  4.500000
2     7.0     9.0     2.0     2.0    4.0  5.000000
3     6.0     8.0     1.0     7.0    3.0  7.000000
4     NaN     NaN     6.0     6.0    3.0  6.000000

我不知道是否有一种方法可以将函数添加到 pandas.mean() 函数,或者是否更简单地将一周的前 x 列相加(也许将每一行变成一个列表?)然后除以顶部x 列。

【问题讨论】:

有人可以解释否决票吗?如果你不告诉我你为什么这么做,我怎么能知道什么值得投反对票? 【参考方案1】:

首先使用DataFrame.meltDataFrame.sort_values,然后用GroupBy.cumcount比较计数器,用Top x比较计数器并过滤,最后聚合mean

df1 = df.melt('Top x', ignore_index=False).sort_values('value', ascending=False)

df['Mean'] = (df1[df1.groupby(level=0).cumcount().lt(df1['Top x'])]
                     .groupby(level=0)['value'].mean())
print (df)
   week 1  week 2  week 3  week 4  Top x      Mean
0     1.0     3.0     1.0     NaN    3.0  1.666667
1     5.0     NaN     2.0     4.0    2.0  4.500000
2     7.0     9.0     2.0     2.0    4.0  5.000000
3     6.0     8.0     1.0     7.0    3.0  7.000000
4     NaN     NaN     6.0     6.0    3.0  6.000000

替代解决方案(在大型数据帧中应该更快)是通过DataFrame.rankDataFrame.where 测试排序值:

df1 = df.drop('Top x', axis=1)
df['Mean'] = (df1.where(df1.rank(axis=1, method='first', ascending=False)
                           .le(df['Top x'], axis=0))
                 .mean(axis=1))
print (df)
   week 1  week 2  week 3  week 4  Top x      Mean
0     1.0     3.0     1.0     NaN    3.0  1.666667
1     5.0     NaN     2.0     4.0    2.0  4.500000
2     7.0     9.0     2.0     2.0    4.0  5.000000
3     6.0     8.0     1.0     7.0    3.0  7.000000
4     NaN     NaN     6.0     6.0    3.0  6.000000

【讨论】:

以上是关于熊猫在最高 x 列中的平均值的主要内容,如果未能解决你的问题,请参考以下文章

这是用熊猫中列的平均值替换字符串的正确方法吗?

时间序列重采样错误 - 熊猫列中没有日期索引

我如何从熊猫绘制 k 均值聚类?

具有时间偏移熊猫的滚动平均值

计算熊猫中的groupby(几列)平均值[重复]

根据熊猫中的两列数据计算平均值和平均值[重复]