panda根据与另一列中某个条件匹配的行,用均值填充0



我有一个如下的数据帧,其中我需要用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

相关内容

  • 没有找到相关文章

最新更新