一系列平均值,跳过元素[0]

时间:2019-02-27 11:39:25

标签: python numpy series

我在数据框中有一列,每一行的大小各不相同:

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处的元素。

1 个答案:

答案 0 :(得分:2)

通过索引[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)))