Pandas Dataframe,平均非 0 值
Posted
技术标签:
【中文标题】Pandas Dataframe,平均非 0 值【英文标题】:Pandas Dataframe, average non 0 value 【发布时间】:2021-05-05 18:44:35 【问题描述】:我有以下 Pandas Dataframe 'df':
a1 a2 a3 b1
0 0 0 1
1 2 0 2
3 0 0 3
2 4 0 4
如何从a1、a2、a3中得到“a”的平均值,忽略0值?
a1 a2 a3 b1 avg(a)
0 0 0 1 0
1 2 0 2 1.5
3 0 0 3 3.0
2 4 0 4 3.0
我坚持使用手动方法,将值 > 0 转换为 1
【问题讨论】:
【参考方案1】:你可以.filter
a
喜欢列,然后.mask
这些列中的零,然后.mean
和axis=1
一起取:
a = df.filter(like='a')
df['avg'] = a.mask(a.eq(0)).mean(1).fillna(0)
# OR df['avg'] = a[a > 0].mean(1).fillna(0)
a1 a2 a3 b1 avg
0 0 0 0 1 0.0
1 1 2 0 2 1.5
2 3 0 0 3 3.0
3 2 4 0 4 3.0
【讨论】:
谢谢,如果我有很多平均,这现在可以工作,例如 a1 a2 a3, b1 b2 b3 我只需要为这些列创建变量 @ngakanalit 你能详细说明一下吗?您是否需要平均所有a's
列然后是所有 b 的列?【参考方案2】:
import pandas as pd
df = pd.DataFrame('a1': [0, 1, 3, 2],
'a2': [0, 2, 0, 4],
'a3': [0, 0, 0, 0],
'b1': [1, 2, 3, 4])
# remove the last column
df1 = df.drop('b1', 1)
# counting non-zeros
df2 = df1.astype(bool).sum(axis=1)
# sum and divide
df3 = df1.sum(axis=1) / df2
df['avg(a)'] = df3.fillna(0)
print(df)
a1 a2 a3 b1 avg(a)
0 0 0 0 1 0.0
1 1 2 0 2 1.5
2 3 0 0 3 3.0
3 2 4 0 4 3.0
【讨论】:
在某些情况下这种方法会很方便,但上面的解决方案要简单得多,谢谢以上是关于Pandas Dataframe,平均非 0 值的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用notnull函数和astype函数将dataframe中所有缺失值映射为0,非缺失值映射为1
Pandas:用前一个和下一个非缺失值的平均值动态替换 NaN 值