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是相同的