大熊猫中是否有任何包装可以基于其他列计算列值的所选部分的平均值

时间:2019-01-06 09:32:48

标签: python-3.x pandas dataframe

我正在尝试基于其他列计算数据帧列的平均值,例如我有a,c d列,而e列包含平均值。如果'a'列有6行有值,则计算e列中有6行的平均值,并且仅给出一个值。接下来检查c列是否有值,然后计算均值对应值,然后检查c列并执行相同操作。

我尝试了这段代码,但是没有给出我想要的结果

df['mean']=df['e'].rolling(window=6, min_periods=6).mean()

原始数据框:

enter image description here

所需的输出:

enter image description here

示例:

df = pd.DataFrame({
         'a':[0] * 6 + [np.nan] * 13,
         'c':[np.nan] * 6 + [400] * 7+ [np.nan] * 6,
         'd':[np.nan] * 13 + [300] * 6,
         'e':[3,4,5,6,8,10,
              3,4,5,6,8,5,5
              ,4,5,6,8,10,11]
})
print (df)
      a      c      d   e
0   0.0    NaN    NaN   3
1   0.0    NaN    NaN   4
2   0.0    NaN    NaN   5
3   0.0    NaN    NaN   6
4   0.0    NaN    NaN   8
5   0.0    NaN    NaN  10
6   NaN  400.0    NaN  3
7   NaN  400.0    NaN  4
8   NaN  400.0    NaN  5
9   NaN  400.0    NaN  6
10  NaN  400.0    NaN  8
11  NaN  400.0    NaN  5
12  NaN  400.0    NaN  5
13  NaN    NaN  300.0   4
14  NaN    NaN  300.0   5
15  NaN    NaN  300.0   6
16  NaN    NaN  300.0   8
17  NaN    NaN  300.0  10
18  NaN    NaN  300.0  11

请检查第一组和第二组的平均值是否相同,因此在输出中,您的代码将给出第一组的平均值,以便用NAn进行第二次替换,但我也希望第二组的平均值甚至相同

1 个答案:

答案 0 :(得分:1)

使用:

df = pd.DataFrame({
         'a':[np.nan] * 2 + [0]*4 + [np.nan] * 13,
         'c':[np.nan] * 6 + [400] * 7+ [np.nan] * 6,
         'd':[np.nan] * 13 + [300] * 6,
         'e':[3,4,5,6,8,10,
              11,54,56,46,95,89,45
              ,4,5,6,8,10,11]
})
#print (df)

df1 = df[['a','c','d']]
s = df1.ffill(axis=1).iloc[:, -1].fillna(-1)
#create groups by consecutive values
m = s.ne(s.shift()).cumsum()

#get means per groups with transform and set only last value of group to new column
df['mean_e'] = np.where(~m.duplicated(keep='last') & ~df1.isnull().all(axis=1), 
                        df['e'].groupby(m).transform('mean'), 
                        np.nan)

print (df)
      a      c      d   e     mean_e
0   NaN    NaN    NaN   3        NaN
1   NaN    NaN    NaN   4        NaN
2   0.0    NaN    NaN   5        NaN
3   0.0    NaN    NaN   6        NaN
4   0.0    NaN    NaN   8        NaN
5   0.0    NaN    NaN  10   7.250000
6   NaN  400.0    NaN  11        NaN
7   NaN  400.0    NaN  54        NaN
8   NaN  400.0    NaN  56        NaN
9   NaN  400.0    NaN  46        NaN
10  NaN  400.0    NaN  95        NaN
11  NaN  400.0    NaN  89        NaN
12  NaN  400.0    NaN  45  56.571429
13  NaN    NaN  300.0   4        NaN
14  NaN    NaN  300.0   5        NaN
15  NaN    NaN  300.0   6        NaN
16  NaN    NaN  300.0   8        NaN
17  NaN    NaN  300.0  10        NaN
18  NaN    NaN  300.0  11   7.333333