Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在大熊猫中有效聚集_Python_Pandas_Aggregate - Fatal编程技术网

Python 如何在大熊猫中有效聚集

Python 如何在大熊猫中有效聚集,python,pandas,aggregate,Python,Pandas,Aggregate,我的数据集: 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

我的数据集:

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
我正在尝试在PANDAS中创建以下sql查询:

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)

是否有更有效的方法/最佳实践来执行此操作?

最简单的方法是使用
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

下面是一种方法,在我的示例中使用合成数据:

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

欢迎来到SO。能否请您提供样本数据和预期输出(如问题中的文本?)此外,我不确定我是否理解“agg”的作用。据我所知,它不在原始SQL查询中。hi@Roy2012,谢谢。我编辑了这个问题,但我很难将数据对齐……至于“agg”的角色,唯一的目的是对整个表执行聚合。有更好的方法吗?好的,答案已编辑。x_cnt和x_cnt0是相同的