#python-3.x #pandas
#python-3.x #панды
Вопрос:
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)
но я хочу среднее значение x, где число больше 0, поэтому результат должен быть (1 2 3)/3=2
.
Как я должен это решить?
Ответ №1:
Заменить не больше, как 0
в x
столбце, на 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
Ответ №2:
Вы можете написать и использовать свою пользовательскую функцию. Пример:
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