【发布时间】:2021-05-27 18:54:12
【问题描述】:
df=pd.DataFrame({"x":[1,2,3,0],"y":[1,1,1,1]})
df.groupby("y").agg(x_sum=("x",np.mean))
此代码给出 x 的平均值,输出为 1.5 ((1+2+3+0)/4=1.5)
但我想要大于 0 的 x 的平均值,所以输出应该是(1+2+3)/3=2。
我该如何解决?
【问题讨论】:
标签: python-3.x pandas
df=pd.DataFrame({"x":[1,2,3,0],"y":[1,1,1,1]})
df.groupby("y").agg(x_sum=("x",np.mean))
此代码给出 x 的平均值,输出为 1.5 ((1+2+3+0)/4=1.5)
但我想要大于 0 的 x 的平均值,所以输出应该是(1+2+3)/3=2。
我该如何解决?
【问题讨论】:
标签: python-3.x pandas
将x 列中的0 等不大于NaN 替换为NaN:
df.x = df.x.where(df.x.gt(0))
#alternative
#df.x = df.x.mask(df.x.le(0))
print (df)
x y
0 1.0 1
1 2.0 1
2 3.0 1
3 NaN 1
df1 = df.groupby("y").agg(x_sum=("x",np.mean))
print (df1)
x_sum
y
1 2.0
【讨论】:
您可以编写和使用您的自定义函数。示例:
import pandas as pd
import numpy as np
def mean_without_zero_values(values):
vals = [v for v in values if v > 0]
return np.mean(vals)
df=pd.DataFrame({"x":[1,2,3,0],"y":[1,1,1,1]})
result = df.groupby("y").agg(x_sum=("x",mean_without_zero_values))
print(result)
# output
# x_sum
# y
# 1 2
【讨论】: