我在数据框中有一列,每一行的大小各不相同:
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处的元素。
答案 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)))