【问题标题】:Renaming Column Names in Pandas Groupby function [duplicate]在 Pandas Groupby 函数中重命名列名
【发布时间】:2013-10-31 15:25:21
【问题描述】:

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

我想通过IDRegion 对该数据集的观察进行分组,并对每个组的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 数据框函数中使用列名而不用引号括起来?

我知道变量名是字符串,所以必须在引号内,但我看看是否在数据框函数之外使用它们,并且作为属性,我们不要求它们在引号内。像df.ID.sum() 等。只有当我们在像df.sort()df.groupby 这样的DataFrame 函数中使用它时,我们必须在引号内使用它。这实际上有点痛苦,因为在 SQL 或 SAS 或其他语言中,我们只是使用变量名而不引用它们。对此有何建议?

请回答两个问题(Q1 是主要的,Q2 更多的意见)。

【问题讨论】:

    标签: python pandas group-by pandas-groupby rename


    【解决方案1】:

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

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

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

    至于第二个,我会说答案是否定的。因为python datamodel,所以可以像'df.ID'一样使用它:

    属性引用被翻译成这个字典中的查找, 例如,m.x 等价于 m.dict["x"]

    【讨论】:

    • 感谢回复。重命名的事情有所帮助,除了我猜在第一个语法中我们还需要提到 columns=.. 所以,.rename(columns={'count ':'Total_Numbers'})。否则它将作为索引而不更改列名。第二件事完美无缺,但如果需要重命名一个或两个变量,那么我想第一个更方便,而不是在第二种语法中提及所有变量名。我希望 groupby 中是否有某些东西,但看起来没有。我也知道 pandas df 是一个 dict 内在函数。希望 Pandas 有一些灵活性
    【解决方案2】:

    当前(从 0.20 版开始)在 groupby 操作后更改列名的方法是链接 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) 删除顶层的分层索引。

    【讨论】:

      猜你喜欢
      • 2021-02-24
      • 2017-03-28
      • 2020-06-22
      • 1970-01-01
      • 2021-04-24
      • 2018-12-18
      • 2021-09-03
      • 1970-01-01
      • 2018-10-27
      相关资源
      最近更新 更多