此问题已在此处有答案:
Multiple aggregations of the same column using pandas GroupBy.agg()(4个答案)
4年前关闭。
Q1)我想做一个groupby,SQL风格的聚合,然后重命名输出列:
示例数据集:
>>> df
ID Region count
0 100 Asia 2
1 101 Europe 3
2 102 US 1
3 103 Africa 5
4 100 Russia 5
5 101 Australia 7
6 102 US 8
7 104 Asia 10
8 105 Europe 11
9 110 Africa 23
我想将这个数据集的观测值按ID
和Region
分组,并对每组的count
求和。所以我用了这样的东西…
>>> print(df.groupby(['ID','Region'],as_index=False).count().sum())
ID Region count
0 100 Asia 2
1 100 Russia 5
2 101 Australia 7
3 101 Europe 3
4 102 US 9
5 103 Africa 5
6 104 Asia 10
7 105 Europe 11
8 110 Africa 23
在使用as_index=False
时,我能够得到“类似SQL”的输出。我的问题是我无法在这里重命名聚合变量count
。所以在SQL中,如果我想做上面的事情,我会这样做:
select ID, Region, sum(count) as Total_Numbers
from df
group by ID, Region
order by ID, Region
正如我们所看到的,在SQL中,我很容易将聚合变量count
**重命名为Total_Numbers
。我想在Pandas中做同样的事情,但无法在group-by函数中找到这样的选项。有人能帮忙吗?
第二个问题(更多的是观察)是是否……
Q2)Pandas dataframe函数中是否可以直接使用列名,而不用引号括起来?
我知道变量名是字符串,所以必须在引号内,但我看到如果在dataframe函数外使用它们,并且作为属性,我们不要求它们在引号内。如df.ID.sum()
等。只有当我们在像df.sort()
或df.groupby
这样的DataFrame函数中使用它时,我们才必须在引号内使用它。这实际上有点痛苦,因为在SQL或SAS或其他语言中,我们只是使用变量名而不引用它们。对此有何建议?
请回答这两个问题(Q1是主要的,Q2更多的是一个观点)。
2条答案
按热度按时间kgsdhlau1#
对于第一个问题,我认为答案是:
或
如果是Pandas系列
至于第二个,我会说答案是否定的。由于python datamodel,可以像'df.ID'一样使用它:
属性引用被转换为该字典中的查找,例如,m.x等效于m.dict[“x”]
kknvjkwl2#
在groupby操作后更改列名的当前(从0.20版开始)方法是链接
rename
方法。有关详细信息,请参阅文档中的此弃用说明。pandas 0.20版本起已弃用的Answer
这是谷歌的第一个结果,虽然最上面的答案有效,但它并没有真正回答问题。有一个better answer here和一个长discussion on github关于将字典传递给
agg
方法的完整功能。不幸的是,这些答案并不存在于文档中,但是分组、聚合和重命名列的一般格式使用字典的字典。外部字典的键是要聚合的列名。内部字典有一些键,新列的名字和聚合函数的值.
在此之前,让我们创建一个四列DataFrame。
假设我们希望按列
A, B
分组,并将列C
与mean
和median
聚合,并将列D
与max
聚合。下面的代码可以做到这一点。这将返回一个具有分层索引的DataFrame。最初的问题询问了在同一步骤中重命名列的问题。这可以使用字典的字典:
这将一次性重命名所有列,但仍然保留分层索引,可以使用
df.columns = df.columns.droplevel(0)
删除顶层。