【问题标题】:Average of a series, skipping element[0]系列的平均值,跳过元素[0]
【发布时间】:2019-02-27 11:39:24
【问题描述】:

我在数据框中有一列,每行包含一系列不同大小的列:

values
[0.0,2.3,4.6,99,100,200,...]
[0.0,4.6,7.8,10,20,25,10,5.5,12,...]
.
.
.

我计算了每个系列的平均值如下:

from statistics import mean
df['average_values'] = df['values'].map(mean)
df.head()

这会返回:

values                          average_values   
[0.0,2.3,4.6,99,100,200,...]            7.6
[0.0,4.6,7.8,10,20,25,...]              10.5
.
.
.

但是,这些系列中的每一个都以 0.0 开头,我需要从平均列的计算中删除它。

我的尝试

我尝试创建一个新列“nan_values”,它将复制原始值列,但所有 0.0 值都替换为 NaN:

#create new column
df['nan_values'] = df['values'].copy()

#replace the 0.0 in each series with NaN
df['nan_values'] = df['nan_values'].replace(0, np.NaN)

我想我会产生一个看起来像这样的系列:

[NaN, 2.2, 4.4, 5, 3.3, 7.1, ...]

我需要计算多行系列的平均值,但在索引 0 处跳过元素。

【问题讨论】:

  • 您不能将平均值乘以 $n / (n-1)$,其中 $n$ 是行的长度(包括 0.0)吗?

标签: python numpy series


【解决方案1】:

通过索引[1:]删除第一个值:

from statistics import mean
df['average_values'] = df['values'].map(lambda x: mean(x[1:]))

或者:

df['average_values'] = df['values'].str[1:].map(mean)
#alternative
#df['average_values'] = df['values'].str[1:].map(np.mean)

print (df)
                                     values  average_values
0             [0.0, 2.3, 4.6, 99, 100, 200]         81.1800
1  [0.0, 4.6, 7.8, 10, 20, 25, 10, 5.5, 12]         11.8625

如果要删除 0 值,请使用带有过滤的列表理解或 filter

df['average_values'] = df['values'].map(lambda x: mean([y for y in x if y != 0]))

或者:

df['average_values'] = df['values'].map(lambda x: mean(filter(lambda y: y != 0, x)))

【讨论】:

  • 这行得通。我不明白 .map(lambda x: mean(x[1:])) 的作用。谢谢。
  • 它调用函数列出没有第一个元素,检查.map(lambda x:x[1:])
猜你喜欢
  • 1970-01-01
  • 2020-07-12
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多