我有一个如下的数据帧,其中我需要用parent_key与self_key匹配的行的平均值替换0。
输入数据帧:df= pd.DataFrame ({'self_key':['a','b','c','d','e','e','e','f','f','f'],'parent_key':[np.nan,'a','b','b','c','c','c','d','d','d'], 'value':[0,0,0,0,4,6,14,12,8,22],'level':[1,2,3,3,4,4,4,4,4,4]})
第3行的self_key为"d",因此我需要将其在列"value"中的0值替换为第7、8、9行的平均值,以填充正确的值14。由于较低的级别进入较高的级别,我也需要从最低级别到最高级别来填充数据帧,但当我执行以下代码时,它不起作用,并且我得到错误";ValueError:'<的Grouper;类'pandas.core.frame.DataFrame'>'不是一维的";。如何用从最低级别到最高级别的平均值填充0?
df['value']=np.where((df['value']==0) & (df['level']==3), df['value'].groupby(df.where(df['parent_key']==df['self_key'])).transform('mean'), df['value'])
输入
self_key parent_key value level
0 a NaN 0 1
1 b a 0 2
2 c b 0 3
3 d b 0 3
4 e c 4 4
5 e c 6 4
6 e c 14 4
7 f d 12 4
8 f d 8 4
9 f d 22 4
我的方法是重复上面的代码3次,并将级别从3更改为2,再更改为1,但即使是级别3也不起作用。
预期输出:
self_key parent_key value level
0 a NaN 11 1
1 b a 11 2
2 c b 8 3
3 d b 14 3
4 e c 4 4
5 e c 6 4
6 e c 14 4
7 f d 12 4
8 f d 8 4
9 f d 22 4
如果我正确理解您的问题,您正试图通过过滤某些键上的数据帧,以自下而上的方式计算mean。如果是这样的话,那么下面应该解决它:
for l in range(df["level"].max()-1, 0, -1):
df_sub = df[(df["level"] == l) & (df["value"] == 0)]
self_keys = df_sub["self_key"].tolist()
for k in self_keys:
df.loc[df_sub[df_sub["self_key"] == k].index, "value"] = df[df["parent_key"] == k]["value"].mean()
[Out]:
self_key parent_key value level
0 a 11 1
1 b a 11 2
2 c b 8 3
3 d b 14 3
4 e c 4 4
5 e c 6 4
6 e c 14 4
7 f d 12 4
8 f d 8 4
9 f d 22 4