Группировать по среднему значению для элемента со значением> 0

#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