Как эффективно агрегировать в PANDAS - PullRequest
0 голосов
/ 06 августа 2020

мой набор данных:

agg       x       y
                               
 1       1       2
 1       2       3       
 1       2       1      
 1       4       5

ожидаемый результат:

     X_CNT  X_CNT0  Y_MIN  Y_MAX  Y_SUM
agg                                    
1        4       0      1      5      11

Я пытаюсь создать следующий запрос sql в PANDAS:

CREATE TABLE summ AS 
  SELECT Sum (CASE 
                WHEN x != 0 THEN 1 
                ELSE 0 
              END) AS X_CNT, 
         Sum (CASE 
                WHEN x = 0 THEN 1 
                ELSE 0 
              END) AS X_CNT0, 
         Min (y)   AS Y_MIN, 
         Max (y)   AS Y_MAX, 
         Sum (y)   AS Y_SUM 
  FROM   df

Я подумал о следующем:

df1=df.groupby('agg').agg({'x':lambda val: (val != 0).sum()}).rename(columns={'x':'X_CNT'})
df2=df.groupby('agg').agg({'x':lambda val: (val == 0).sum()}).rename(columns={'x':'X_CNT0'})
df3=df.groupby('agg').agg({'y':'min'}).rename(columns={'y':'Y_MIN'})
df4=df.groupby('agg').agg({'y':'max'}).rename(columns={'y':'Y_MAX'})
df5=df.groupby('agg').agg({'y':'sum'}).rename(columns={'y':'Y_SUM'})

dfs=[df1,df2,df3,df4,df5]
from functools import reduce

summ = reduce(lambda left,right: pd.merge(left,right,how='inner',on='agg'), dfs)

Есть ли более эффективный способ / лучшие практики для выполнения этого?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Вот способ сделать это с данными Syntheti c в моем примере:

df = pd.DataFrame({"x": np.random.randint(0, 3, 6), "y": np.random.randint(0, 3, 6)})
print(df) 
==>
   x  y
0  0  2
1  2  0
2  2  1
3  2  0
4  2  1
5  1  0

res = pd.DataFrame().assign(x_cnt = [(df.x != 0).sum()],
                            x_cnt_0 = [(df.x == 0).sum()], 
                            y_min = [df.y.min()], 
                            y_max = [df.y.max()], 
                            y_sum = [df.y.sum()], 
                           )
print(res)

==>
   x_cnt  x_cnt_0  y_min  y_max  y_sum
0      5        1      0      2      4
1 голос
/ 06 августа 2020

Самый простой - использовать DataFrame конструктор, например:

summ = pd.DataFrame({'X_CNT': (df.x != 0).sum(),
                     'X_CNT0': (df.x == 0).sum(),
                     'Y_MIN': df.y.min(),
                     'Y_MAX': df.y.max(),
                     'Y_SUM': df.y.sum()}, index=[0])
print(summ)
   X_CNT  X_CNT0  Y_MIN  Y_MAX  Y_SUM
0      4       0      1      5     11
...