我正在尝试基于其他列计算数据帧列的平均值,例如我有a,c d列,而e列包含平均值。如果'a'列有6行有值,则计算e列中有6行的平均值,并且仅给出一个值。接下来检查c列是否有值,然后计算均值对应值,然后检查c列并执行相同操作。
我尝试了这段代码,但是没有给出我想要的结果
df['mean']=df['e'].rolling(window=6, min_periods=6).mean()
原始数据框:
所需的输出:
示例:
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进行第二次替换,但我也希望第二组的平均值甚至相同
答案 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