在Pandas Groupby函数中重命名列名

时间:2013-10-22 16:23:06

标签: python group-by pandas rename

1)。我有以下示例数据集:

>>> 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对这个数据集的观察进行分组,并对每个组的计数求和。所以我使用了这样的东西:

>>> 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”输出。我的问题是我无法在这里重命名聚合变量计数。所以在SQL中,如果想做上述事情,我会做这样的事情:

select ID, Region, sum(count) as Total_Numbers
from df
group by ID, Region
order by ID, Region

正如我们所看到的,我很容易将聚合变量'count'重命名为SQL中的Total_Numbers。我想在Pandas中做同样的事情,但无法在分组功能中找到这样的选项。有人可以帮忙吗?

2)。第二个问题和更多的观察结果是,是否可以直接在Pandas数据帧函数中使用列名而不将它们括在引号内?我知道变量名是字符串,所以必须在引号内,但我看是否使用外部数据帧函数和作为属性我们不要求它们在引号内。像df.ID.sum()等一样。只有当我们在像df.sort()或df.groupby这样的DataFrame函数中使用它时,我们必须在引号内使用它。这实际上有点痛苦,就像在SQL或SAS或其他语言中我们只是使用变量名而不引用它们。有什么建议吗?

请建议以上两点(第一个主要,第二个意见)。

由于

2 个答案:

答案 0 :(得分:43)

对于第一个问题,我认为答案是:

<your DataFrame>.rename(columns={'count':'Total_Numbers'})

<your DataFrame>.columns = ['ID', 'Region', 'Total_Numbers']

至于第二个,我会说答案是否定的。由于python datamodel

,可以像'df.ID'一样使用它
  

属性引用被转换为此字典中的查找,   例如,m.x相当于m。 dict [“x”]

答案 1 :(得分:21)

在groupby操作之后更改列名的当前(从0.20版开始)方法是链接rename方法。有关详细信息,请参阅文档中的this deprecation note

不赞成回答pandas版本0.20

这是谷歌的第一个结果,虽然最佳答案有效但它并没有真正回答这个问题。关于将字典传递给agg方法的全部功能,有better answer here和长discussion on github

遗憾的是,这些答案在文档中不存在,但分组,聚合和重命名列的一般格式使用字典字典。外部字典的键是要聚合的列名。内部字典具有键,新列以值作为聚合函数。

在我们到达之前,让我们创建一个四列DataFrame。

df = pd.DataFrame({'A' : list('wwwwxxxx'), 
                   'B':list('yyzzyyzz'), 
                   'C':np.random.rand(8), 
                   'D':np.random.rand(8)})

   A  B         C         D
0  w  y  0.643784  0.828486
1  w  y  0.308682  0.994078
2  w  z  0.518000  0.725663
3  w  z  0.486656  0.259547
4  x  y  0.089913  0.238452
5  x  y  0.688177  0.753107
6  x  z  0.955035  0.462677
7  x  z  0.892066  0.368850

假设我们希望按列A, B进行分组,并将列Cmeanmedian汇总,并将列Dmax汇总在一起。以下代码可以执行此操作。

df.groupby(['A', 'B']).agg({'C':['mean', 'median'], 'D':'max'})

            D         C          
          max      mean    median
A B                              
w y  0.994078  0.476233  0.476233
  z  0.725663  0.502328  0.502328
x y  0.753107  0.389045  0.389045
  z  0.462677  0.923551  0.923551

这将返回带有分层索引的DataFrame。原始问题询问是否在同一步骤中重命名列。这可以使用字典词典:

df.groupby(['A', 'B']).agg({'C':{'C_mean': 'mean', 'C_median': 'median'}, 
                            'D':{'D_max': 'max'}})

            D         C          
        D_max    C_mean  C_median
A B                              
w y  0.994078  0.476233  0.476233
  z  0.725663  0.502328  0.502328
x y  0.753107  0.389045  0.389045
  z  0.462677  0.923551  0.923551

这样可以一次性重命名列,但仍保留层级索引,可以使用df.columns = df.columns.droplevel(0)删除顶层。