我有一个列为'x','y','z'的pandas DataFrame 但是,许多x和y值是多余的。我想取所有具有相同x和y值的行,并对第三列求和,返回一个较小的DataFrame。 因此,
x y z
0 1 2 1
1 1 2 5
2 1 2 0
3 1 3 0
4 2 6 1
它将返回:
x y z
0 1 2 6
1 1 3 0
2 2 6 1
我尝试过
df = df.groupby(['x', 'y'])['z'].sum
但是我不确定如何使用分组对象。
答案 0 :(得分:4)
非常接近现状;您只需要调用.sum()
,然后重置索引即可:
>>> df.groupby(['x', 'y'])['z'].sum().reset_index()
x y z
0 1 2 6
1 1 3 0
2 2 6 1
groupby()
中还有一个参数可以处理该问题:
>>> df.groupby(['x', 'y'], as_index=False)['z'].sum()
x y z
0 1 2 6
1 1 3 0
2 2 6 1
在您的问题中,您有df.groupby(['x', 'y'])['z'].sum
,但没有括号。这只是将方法 .sum
引用为Python对象,而不调用它。
>>> type(df.groupby(['x', 'y'])['z'].sum)
method
>>> callable(df.groupby(['x', 'y'])['z'].sum)
True
答案 1 :(得分:0)
不使用groupby
语法的另一种选择是使用索引并按如下所示在索引级别进行求和:
df.set_index(['x','y']).sum(level=[0,1]).reset_index()
输出:
x y z
0 1 2 6
1 1 3 0
2 2 6 1