Pandas忽略0的行平均数

3

我有一个类似这样的DataFrame:

           AD1        AD2        AD3        AD4        AD5
1            0          0          0          0          0
2            0          0          0          0          0
3            0          0          0          0          0
4            0          0          0          0          0
5            0          0          0          0          0
..         ...        ...        ...        ...        ...
497  138099424  126282256          0  197637664          0
498   90184696   53508360   90254688   66803036   57421672
499   41476688   54889712   36677268   33858400   50282272
500   26322476   27609302   26245020   20566374   23664970
501  595136256  241994400  489766144  314901408  730741120

我需要找出每一行的平均值,忽略值为0的情况。我的初始计划是将0替换为NaN,然后在排除NaN的情况下获取平均值。
我尝试用NaN替换0,但这没有生效,DataFrame仍包含0。我尝试了:
df = df.replace(0, np.nan)
df = df.replace(0, np.nan, inplace=True)

第二个问题是,即使知道会包括0,当我尝试计算平均数时,也无法计算出平均数。我使用了:

df = df.assign(mean=df.mean(axis=1))

结果是:
           AD1        AD2        AD3        AD4        AD5  mean
1            0          0          0          0          0   NaN
2            0          0          0          0          0   NaN
3            0          0          0          0          0   NaN
4            0          0          0          0          0   NaN
5            0          0          0          0          0   NaN
..         ...        ...        ...        ...        ...   ...
497  138099424  126282256          0  197637664          0   NaN
498   90184696   53508360   90254688   66803036   57421672   NaN
499   41476688   54889712   36677268   33858400   50282272   NaN
500   26322476   27609302   26245020   20566374   23664970   NaN
501  595136256  241994400  489766144  314901408  730741120   NaN

我该如何完成这个任务?
5个回答

3
您可以使用mask+mean
df['mean'] = df.mask(df==0).mean(axis=1)

输出:

           AD1        AD2        AD3        AD4        AD5         mean
1            0          0          0          0          0          NaN
2            0          0          0          0          0          NaN
3            0          0          0          0          0          NaN
4            0          0          0          0          0          NaN
5            0          0          0          0          0          NaN
497  138099424  126282256          0  197637664          0  154006448.0
498   90184696   53508360   90254688   66803036   57421672   71634490.4
499   41476688   54889712   36677268   33858400   50282272   43436868.0
500   26322476   27609302   26245020   20566374   23664970   24881628.4
501  595136256  241994400  489766144  314901408  730741120  474507865.6

当我这样做时,它仍然返回我发布的第二个数据框。 - lcfields
@lcfields 可能数据类型不同,请尝试先使用 df=df.astype(float) - user7864386

2

使用replace而不是fillna

df = df.replace(0, np.nan)

对于平均数:

df['mean'] = df.replace(0, np.nan).mean(axis=1)

或者,翻译成文本如下:
df.assign(mean=df.replace(0, np.nan).mean(axis=1))

df.replace也不起作用。 - lcfields
@lcfields 你确定你有整数吗?检查一下数据类型。 - mozway
数据类型是<class 'pandas.core.frame.DataFrame'>。我还执行了df.apply(pd.to_numeric)以确保安全。 - lcfields

1
你正在使用错误的函数替换0值。你应该真正关注 df.replace() 函数:
df = df.replace(0, np.nan)
# or
df.replace(0, np.nan, inplace=True)

df.replace 也不起作用。 - lcfields
@lcfields 你能再检查一下数据类型吗?你的数据框中可能有字符串而不是浮点数或整数。 - TYZ

1
我尝试将0替换成NaN,但是这并没有起作用,DataFrame仍然包含0。我尝试着将字符串值转换为数字。
df['mean'] = df.astype(float).replace(0, np.nan).mean(axis=1)
print(df)

# Output
           AD1        AD2        AD3        AD4        AD5         mean
1            0          0          0          0          0          NaN
2            0          0          0          0          0          NaN
3            0          0          0          0          0          NaN
4            0          0          0          0          0          NaN
5            0          0          0          0          0          NaN
497  138099424  126282256          0  197637664          0  154006448.0
498   90184696   53508360   90254688   66803036   57421672   71634490.4
499   41476688   54889712   36677268   33858400   50282272   43436868.0
500   26322476   27609302   26245020   20566374   23664970   24881628.4
501  595136256  241994400  489766144  314901408  730741120  474507865.6

0

要将数值为0的值替换为NaN,您可以使用 pandas.DataFrame.replacedropna,按照以下方法进行:

df.replace(0, pd.NaT)

调用上述方法后,您将替换NaN

df.dropna()

最后mean被计算出来了

df["mean"] = df.mean(axis=1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接